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


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.