Адресная арифметикаУказатель как адрес памяти
Рассмотренное понятие указателя не является полным. Более широкое толкование смысла указателя возникает в Си при введении особой операции указатель+целое , которая называется операцией АДРЕСНОЙ АРИФМЕТИКИ и интерпретируется следующим образом:
-любой указатель потенциально ссылается на неограниченную в обе стороны область памяти, заполненную переменными указуемого типа;
-переменные в области нумеруются от текущей указуемой переменной, которая получает относительный номер 0. Переменные в направлении возрастания адресов памяти нумеруются положительными значениями 1,2,3..., убывания - отрицательными --1,-2..;
-результатом операции " указатель + i" является адрес i-й переменной (значение указателя на i-ю переменную) в этой области относительно текущего положения указателя.
Таким образом, указатель ссылается на неограниченный массив с относительной нумерацией элементов массива от указуемой переменной. С учетом сказанного, ряд выражений, использующих операцию адресной арифметики, имеют свой особый смысл:
*p // Значение указуемой переменной;
p + i // Указатель на i-ю переменную после указуемой;
p -i // Указатель на i-ю переменную перед указуемой;
*(p+i) // Значение i-й переменной после указуемой;
p[i] // Значение i-й переменной после указуемой;
p++ // Установить указатель не переменную, следующую
// за указуемой;
p-- // Установить указатель на переменную,
// предшествующую указуемой;
p+=i // Переместить указатель на i переменных вперед
// относительно указуемой;
p-=i // Переместить указатель на i переменных назад
// относительно указуемой;
*p++ // Получить значение указуемой переменной и
// установить указатель на следующую;
*(--p) // Переместить указатель к переменной,
// предшествующей указуемой, и получить ее
// значение.
В операциях адресной арифметики транслятором автоматически учитывается размер указуемых переменных, то есть " +i" понимается не как смещение на i байтов, слов и пр., а как смещение на i указуемых переменных. Другая важная особенность: при перемещении указателя нумерация переменных в памяти остается относительной и всегда производится от текущей указуемой переменной.