Указатель является переменной, которая содержит адрес другой переменной или функции. Описание указателя определяет тип данных, на которые ссылается указатель, оно имеет вид:
тип_указываемых данных *имя_указателя;
Для доступа к объекту, на который ссылается указатель, используется имя указателя со звездочкой перед ним. Эта операция называется разыменовыванием указателя, она корректно выполняется только, если указатель был предварительно инициализирован:
int i=100;// определяется целая переменная
int *point_i;// определяется указатель на целую переменную
pointi=&i; // указатель инициализируется адресом
// переменной i
printf(“%i”,*pointi); // выводится значение переменной,
// определяемое указателем. Оно равно
// значению переменной i (100).
Обратите внимание на операцию определения адреса (&). Она является противоположной разыменованию. Массивы и указатели тесно связаны друг с другом. Имя массива соответствует указателю на начало массива. Поэтому можно присваивать указателю адрес первого элемента массива, используя имя массива.
int array[10];
int *iptr=array;
С указателями можно выполнять целочисленные арифметические операции. При этом происходит вычисление адреса соответствующего элемента массива, а не адреса в памяти компьютера. Размер элемента определяется типом указателя. Для типа void соответственно никакие операции выполнять нельзя.
Указатель можно индексировать как массив. Следующие два оператора эквивалентны:
array[3]=10;
*(array+3)=10;
Указатели вместо массивов целесообразно использовать тогда, когда требуется последовательный доступ к элементам массива. Такая операция выполняется значительно быстрее, например:
int *ptemp=array;
for(int i=1;i<10;i++)
*(ptemp++)=0;
можно использовать для обнуления массива array.