Лекция: Арифметика указателей

К указателям можно применять некоторые арифметические операции. К таким операциям относятся: +,-, ++, --. Результаты выполнения этих операций по отношению к указателям существенно отличаются от результатов соответствующих арифметических операций, выполняющихся с обычными числовыми данными.

Рассмотрим следующий пример:

 

int A = 20, B = 30;

int *p1 = &A;

 

Пусть переменные Aи B расположены в памяти, например, так, как это показано на следующем рисунке:

 

    A = 20 B = 30 p1 = 100            
                                       
   
                                                                               

 

Указатель p1 содержит адрес переменной A, который равен 100 и *p1 будет равно значению переменной A, то есть 20. Выполним следующую операцию:

 

p1 = p1 + 1;

или, что то же самое:

 

p1++;

Значение указателя изменится и станет равным 104, а не 101, как, наверное, ожидалось. То есть теперь указатель ссылается уже на переменную Bи значение *p1будет равно 30.

Таким образом, добавление или вычитание 1 из указателя приводит к изменению его значения на размер базового типа указателя. В общем случае, например, при выполнении следующей операции:

 

p1 = p1 + N; // N– некоторое целое значение

 

значение указателя увеличится на sizeof(<базовый тип указателя>) * N и в нашем случае это приращение будет равно sizeof(int) * N = 4 * N. Так, если N = 4, а p1= 100, то значение указателя p1 увеличится на 16 и станет равно 116, и указатель будет ссылаться на данные, расположенные по адресу 116.

Внимание.Добавлять к указателям или вычитать из указателей можно только целые значения.

Поскольку упомянутые арифметические операции выполняются по-разному при их применении к указателям и обычным арифметическим типам данных, а также учитывая высший приоритет операции *, при использовании указателей в составе выражений следует внимательно обращаться со скобками. Например, выражения (см. предыдущий рисунок)

*(p1 + 1) и *p1 + 1

 

имеют совершенно разный смысл. Первое выражение даст значение 30, а второе выражение будет равно 21 (в первом выражении сначала изменяется адрес, а затем осуществляется обращение в память по этому измененному адресу; во втором выражении мы обращаемся по старому адресу и к значению, хранящемуся по этому адресу добавляем 1).

еще рефераты
Еще работы по информатике