Бьерн Страуструп - Язык программирования С++. Главы 2-4 - Указатели
ОГЛАВЛЕНИЕ
Страница 13 из 69
2.3.5 Указатели
Для большинства типов T указатель на T имеет тип T*. Это значит, что переменная типа T* может хранить адрес объекта типа T. Указатели на массивы и функции, к сожалению, требуют более сложной записи:int* pi;Главная операция над указателями - это косвенное обращение (разыменование), т.е. обращение к объекту, на который настроен указатель. Эту операцию обычно называют просто косвенностью. Операция косвенности * является префиксной унарной операцией. Например:
char** cpp; // указатель на указатель на char
int (*vp)[10]; // указатель на массив из 10 целых
int (*fp)(char, char*); // указатель на функцию с параметрами
// char и char*, возвращающую int
char c1 = 'a';Переменная, на которую указывает p,- это c1, а значение, которое хранится в c1, равно 'a'. Поэтому присваиваемое c2 значение *p есть 'a'. Над указателями можно выполнять и некоторые арифметические операции.
char* p = &c1; // p содержит адрес c1
char c2 = *p; // c2 = 'a'
Ниже в качестве примера представлена функция, подсчитывающая число символов в строке, заканчивающейся нулевым символом (который не учитывается):
int strlen(char* p)Можно определить длину строки по-другому: сначала найти ее конец, а затем вычесть адрес начала строки из адреса ее конца.
{
int i = 0;
while (*p++) i++;
return i;
}
int strlen(char* p)Широко используются указатели на функции; они особо обсуждаются в $$4.6.9
{
char* q = p;
while (*q++) ;
return q-p-1;
}