Адресная арифметика
Помимо операций присваивания, получения адреса и обращения по адресу, над указателями можно выполнять ограниченный набор арифметических и логических операций.
К указателю можно прибавить целое число, например, 1. Прибавление единицы к указателю увеличивает значение указателя на число байтов, отводимое под одну переменную того типа, на который указывает указатель. Это не должно вызывать удивления, если не забывать, что значениями указателей являются адреса. То есть при увеличении значения указателя на единицу, он “сдвигается вперед” на одну переменную данного типа.
В общем случае при прибавлении любого целого положительного числа указатель сдвигается вперед на соответствующее количество переменных того типа, на который указывает указатель. Другими словами, значение выражения
ptr+n
где ptr – указатель, а n – целое число, представляет собой значение ptr, увеличенное на величину n*sizeof(*ptr).
Для указателей, как и для обычных переменных, определены операции ++ и +=, сочетающие в себе увеличение и присваивание. Так,
ptr++;
для указателя ptr означает увеличение его значения на sizeof(*ptr), а, скажем,
ptr+=2;
– на 2*sizeof(*ptr).
От указателя можно отнять целое число. При вычитании из указателя ptr целого положительного числа указатель сдвигается назад на соответствующее количество переменных того типа, на который он указывает (в байтах – на величину n*sizeof(*ptr), где n – вычитаемое число). Для указателей определены также операции -- и -=.
Указатели на один и тот же тип можно вычитать друг из друга. Разность указателей показывает, сколько переменных соответствующего типа может поместиться между указанными адресами. Разность указателей может быть отрицательной, если первый операнд операции (уменьшаемое) меньше второго (вычитаемого).
Указатели на данные одного и того же типа можно сравнивать с помощью обычных операций сравнения. При сравнении указателей сравниваются их значения (хранимые в них адреса), а не значения величин, на которые данные указатели указывают.
Сравнение указателей с числовыми значениями как сравнение данных разных типов не определено. Чтобы сравнить значение указателя с числовым адресным значением, необходимо явно преобразовать число в указатель на данные требуемого типа. Например, выражение
xptr > 0x12FF00
будет ошибочным, а выражение
xptr > (int*)0x12FF00
правильным.
Список операций, в которых указатели могут участвовать в качестве операндов, обусловлен спецификой адресов и исчерпывается операциями, перечисленными выше. Так, естественно, не определены операции сложения, умножения и деления указателей, а также умножения и деления указателей на число и изменения знака у указателя.
Приоритет и порядок выполнения операций & и * тот же, что у других унарных операций (!, ~, -). То есть для
int i, *ip=&i;
*ip+1 – это (*ip)+1, а не *(ip+1).
Дата добавления: 2015-11-10; просмотров: 714;