Функции работы со строками из библиотеки обработки строк.
Раздел 6.
Указатели и строки.
Объявления и инициализация переменных указателей.
Указатели - переменные, которые содержат в качестве своих значений адреса памяти.
Имя переменной отсылает к значению прямо, а указатель - косвенно. Ссылка на значение с помощью указателя называется - косвенной адресацией. Указатели, как и другие переменные, перед своим использованием должны быть объявлены.
Объявление
int *countPtr, count;
объявляет переменную countPtr, типа int * (т.е. указатель на целое число) и читается как «countPtr является указателем на целое число» или «countPtr указывает на объект типа int».
Переменная count объявлена как целое число, а не как указатель на целое число. Символ * относится только к countPtr. Каждая переменная, объявляемая как указатель, должна иметь перед собой знак звездочки (*).
Например, объявление
float *xPtr, *yPtr;
указывает, что и xPtr и yPtr являются указателями на значение типа float.
Включать буквы Ptr в имена указателей не обязательно.
|
count прямо ссылается на переменную со значением 7.
countPtr count
count косвенно ссылается на переменную со значение 7.
Указатель может получить в качестве начального значения 0, NULL или адрес.
Операции над указателями.
& или операция адресации – унарная операция, которая возвращает адрес своего операнда. Например, если имеется объявление
int y = 5;
int * yPtr;
то оператор
yPtr = &y;
присваивает адрес переменной y, указателю yPtr.
y
yPtr
показывает схематичное представление памяти после того, как выполнено присваивание.
yPtr y
| |
500 600
Этот рисунок показывает представление указателя в памяти, предполагая, что целая переменная y хранится в ячейке 600, а переменная указатель yPtr хранится в ячейке 500.
Операция * называется операцией косвенной адресации или операцией разыменования. Она возвращает значение объекта, на который указывает её операнд (т.е. указатель).
Например, оператор
cout << * yPtr << endl;
печатает значение переменной y, т.е. 5. Использование *таким способом называется разыменованием указателя.
Вызов функций по ссылке.
Существует 3 способа передачи аргументов в функцию:
· вызов по значению,
· вызов по ссылке с аргументами ссылками,
· вызов по ссылке с аргументами указателями.
Мы знаем, что return можно использовать для возвращения одного значения из вызываемой функции вызывающему оператору (или для передачи управления из вызываемой функции без возвращения какого- либо значения).
Аргументы могут быть переданы функции с использованием аргументов ссылок, чтобы дать возможность функции модифицировать исходные значения аргументов (таким образом, из функции может быть «возвращено» более одного значения), или чтобы передать функции большие объекты данных и избежать копирования объекта при передаче объектов вызовом по значению.
Указатели, также как и ссылки, тоже можно использовать для модификации одного или более значений переменных в вызывающем операторе, или передавать указатели на большие объекты данных (чтобы избежать копирования объектов).
При вызове функции с аргументами, которые должны быть модифицированы, передаются адреса аргументов. Для этого используется операция адресации (&) переменной, которая должна быть изменена.
Массивы не передаются с использованием операции &, потому, что имя массива – начальный адрес массива в памяти.
При передаче функции адреса переменной может использоваться операция косвенной адресацией (*) для модификации значения ячейки в памяти вызывающего оператора. Это возможно только, если значение не объявлено как const.
Рис.5.6ирис.5.7
// рис.5.6
//возведение переменной в куб с использованием вызова по значению
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int cube (int); //прототип
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "rus");
int number=5;
cout<<"Исходное значение числа: "<<number<<endl;
number=cube(number);
cout<<"Новое занчение числа: "<<number<<endl;
return 0;
}
int cube (int n)
{
return n*n*n; //Куб локальной переменной n
}
// рис.5.7
//Возведение перменной в куб с использованием вызова
//по ссылке с аргументом указателя
#include "stdafx.h"
#include <iostream>
using namespace std;
void cube1 (int *); //прототип
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "rus");
int number=5;
cout<<"Исходное значение числа: "<<number<<endl;
cube1(&number);
cout<<"Новое занчение числа: "<<number<<endl;
return 0;
}
void cube1 (int *nPtr)
{
*nPtr=*nPtr**nPtr**nPtr; //куб числа в main
}
Функции работы со строками из библиотеки обработки строк.
char *strcpy (char *s1, const char *s2) – копирует строку s2 в массив символов s1. Возвращает значение s1. Программист должен быть уверен, что массив достаточно велик, чтобы хранить строку и ее завершающий нулевой символ.
char *strncpy (char *s1, const char *s2, size_t n) – копирует не более n символов из строки s2 в массив символов s1. Возвращает значение s1.
char *strcat (char *s1, const char *s2) – Добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх завершающего нулевого символа строки s1. Возвращает значение s1. Программист должен быть уверен, что массив, используемый для хранения первой строки s1,достаточно велик для того, чтобы хранить комбинацию первой строки s1 и второй строки s2.
char * strncat (char *s1, const char *s2, size_t n) – Добавляет не более n символов строки s2 в строку s1. Первый символ из s2 записывается поверх завершающего нулевого символа в s1. Возвращает значение s1.
int strcmp (const char *s1, const char *s2) – Сравнивает строки s1 и s2. Функция возвращает значение 0, меньшее, чем 0 или большее, чем 0, если s1 соответственно равна, меньше или больше, чем s2.
int strncmp (const char *s1, const char *s2, size_t n) – Сравнивает до n символов строки s1 со строкой s2. Функция возвращает значение 0, меньшее, чем 0 или большее, чем 0, если s1 соответственно равна, меньше или больше, чем s2.
char strtok (char *s1, const char *s2) – Последовательность вызовов strtok разбивает строку s1 на «лексемы» - логические куски, такие, как слова в строке текста – разделенные символами, содержащимися в строке s2. Первый вызов содержит в качестве первого аргумента s1, а последующие вызовы для продолжения обработки той же строки, содержат в качестве первого аргумента NULL. При каждом вызове возвращается указатель на текущую лексему. Если при вызове функции лексем больше нет, возвращается NULL.
size_t strlen (const char *s) – Определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу.