1.9. Указатели, адресная арифметика

Указателями называются переменные и константы, значениями которых яв­ляются адреса участков памяти, выделенных для объектов конкретных типов. В языке C так же, как в языке PASCAL, существуют типизированные и обобщен­ные указатели. Типизированные указатели описываются в виде:

базовый тип * имя указателя , * имя указателя , ... ; * относится только к тому имени, непосредственно перед которым она стоит. В одном операторе описания можно описать как переменные некоторого типа, таки указатели на такой тип. Символ * , меняющий тип переменной, называется в таком контексте модификатором. Переменные типа «указатель» можно инициа­лизировать так же, как и числовые переменные, например :

int a=0, *b=&a, **c=&b;

Обобщенный указатель имеет тип void* , в нем можно хранить адреса любых объектов, но его использование ограничено по сравнению с типизированными указателями. Отметим, что любой адрес можно проверить на равенство или не­равенство со специальным значением NULL (аналогичным константе NIL в язы­ке PASCAL), которое записывается вместо нуля. Слово NULL позволяет опреде­лить указатель, который ничего не адресует.

Для указателей определены следующие операции.

1. Операция "значение", записывающаяся в виде * указатель , результат опе­рации есть значение, записанное по адресу, хранящемуся в данном указателе. В языке PASCAL такая операция записывается в виде указатель^ . Операция "зна­чение" применима только к типизированным указателям. Она имеет такой же приоритет, как и все другие унарные операции.

2. К указателям применима операция явного преобразования типа, причем указатель можно преобразовать не только в указатель другого типа, но и в число, и число можно преобразовать в указатель.

3. Операция присваивания = , при этом оба операнда должны быть указате­лями одного типа, либо один из них должен иметь тип void* , либо правый опе­ранд должен быть числом 0.

4. Операции сравнения == , != , < , <= , > , >= , при этом оба операнда долж­ны быть указателями одного типа, либо один из них должен иметь тип void* , либо один из операндов должен быть числом 0.

5. Операция вычитания - , оба операнда должны быть указателями одного типа, либо второй операнд должен быть целым числом.

6. Операция сложения + , при этом второй операнд должен быть целым чис­лом.

7. Увеличение и уменьшение указателя ++ , -- .

8. Операции присваивания += и -= , второй операнд в этом случае должен быть целым числом.

9. Операция "адрес" & .

При выполнении операций 5-8 используется так называемая адресная ариф­метика, т. е. за 1 принимается размер в байтах типа данных, базового для этого указателя. Это свойство арифметических операций с указателями особенно часто используется при работе с массивами.