Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 12. Указатели



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

 
« Предыдущая статья   Следующая статья »