p = p + i или p = p - i
В арифметике указателей при прибавлении или вычитании из указателя целого числа значение его увеличивается или уменьшается не на это число, а на произведение числа на размер объекта (переменной), на который указывает p, т.е на i*(sizeof (тип)), где тип – это тип данных на которые указывает p.
Например:
int *p;
p=&a[0];
p=p+5; // значение указателя p увеличивается на
// 5*sizeof(int) = 10,
// т.е. p теперь указывает на 6-ой элемент
// массива a;
Соответственно с указателями можно использовать операции инкремента и декремента.
p++; // Установить указатель на переменную, следующую за
// той, на которую указатель указывает в данный момент
p--; // Установить указатель на переменную, предшествующую
// той, на которую указатель указывает в данный момент
Таким образом, физическое увеличение или уменьшение указателя зависит от типа указателя, то есть от размера элемента данных и ячейки памяти, на которую указывает указатель.
Разность указателей
Данная операция имеет смысл только тогда, когда указатели ссылаются на элементы одного и того же массива.
|
|
Например:
int x;
p1=&a[0];
p2=&a[5];
x=p2-p1;
Разность двух указателей равна разности их значений, поделенной на sizeof (тип), т.е. x=(3010-3000)/2=5 (см. рис.4.4). Переменной x будет присвоено число элементов массива, расположенных, начиная с адреса p1 и до p2, в данном случае это 5.
Сравнение указателей
Указатели могут сравниваться друг с другом при помощи операций отношения, но сравнение указателей обычно не имеет смысла, если они не ссылаются на элементы одного и того же массива. При сравнении указателей сравниваются адреса, являющиеся значениями указателей. Сравнение двух указателей, ссылающихся на элементы одного и того же массива, могло бы показать, например, что один указатель ссылается на элемент с большим значением индекса, чем другой указатель.
p1=&c[0];
p2=&c[5];
if (p1>p2) – ложь
Любой указатель можно проверять на равенство или неравенство NULL или 0. Указатель NULL совместим с указателем на любой тип и уникален (т.е. никаких объектов, расположенных по нулевому адресу быть не может).
Пусть, например, объявлен указатель *p.
Выражение p!=0 эквивалентно выражению p!=NULL.