Бьерн Страуструп - Язык программирования С++. Главы 2-4 Страница 12. Указатели
|
Страница 12 из 68
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'; char* p = &c1; // p содержит адрес c1 char c2 = *p; // c2 = 'a'
Переменная, на которую указывает p,- это c1, а значение, которое хранится в c1, равно 'a'. Поэтому присваиваемое c2 значение *p есть 'a'. Над указателями можно выполнять и некоторые арифметические операции. Ниже в качестве примера представлена функция, подсчитывающая число символов в строке, заканчивающейся нулевым символом (который не учитывается):
int strlen(char* p) { int i = 0; while (*p++) i++; return i; }
Можно определить длину строки по-другому: сначала найти ее конец, а затем вычесть адрес начала строки из адреса ее конца.
int strlen(char* p) { char* q = p; while (*q++) ; return q-p-1; }
Широко используются указатели на функции; они особо обсуждаются в $$4.6.9
|