Основы программирования

Арифметика указателей


С указателями можно выполнять следующие операции:

  • сложение указателя и целого числа, результат - указатель;
  • увеличение или уменьшение переменной типа указатель, что эквивалентно прибавлению или вычитанию единицы;
  • вычитание двух указателей, результат - целое число.

Прибавление к указателю p целого числа n означает увеличение адреса, который содержится в переменной p, на суммарный размер n элементов того типа, на который ссылается указатель. Указатель как бы сдвигается на n элементов вправо, если считать, что индексы элементов массива возрастают слева направо. Аналогично вычитание целого числа n из указателя означает сдвиг указателя влево на n элементов. Пример:

int *p, *q; int a[100]; p = &(a[5]); // записываем в p адрес 5-го // элемента массива a p += 7; // p будет содержать адрес 12-го эл-та q = &(a[10]); --q; // q содержит адрес элемента a[9]

Значение указателя при прибавлении к нему целого числа n увеличивается на произведение n на количество байтов, занимаемое одним элементом того типа, на который ссылается указатель. В программировании это называют масштабированием.

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

int *p, *q; int a[100]; int n; p = &(a[5]); q = &(a[12]); n = q - p; // n == 7 q = p + n; // q == &(a[12])

Подчеркнем, что указатели нельзя складывать! В отличие от разности указателей, операция сложения указателей (т.е. сложения адресов памяти) абсолютно бессмысленна.

int *p, *q, *r; int a[100]; p = &(a[5]); q = &(a[12]); r = p + q; // Ошибка! Указатели нельзя складывать.



Содержание раздела