Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Операции с указателями

Указатели могут встречаться в выражениях. То есть если p - указатель на объект некоторого типа, то он может использоваться в выражении наряду с другими указателями, а также переменными и константами, не являющимися указателями, например:

*p=-2;

*p/=i-1;

(*p)--;

В первом выражении значение -2 заносится в ячейку памяти по адресу p, во втором выражении это значение уменьшается в i-1 раз, в третьем - уменьшается на единицу. В третьем выражении использованы скобки, так как операции с одинаковым приоритетом выполняются справа налево, таким образом *p-- уменьшит адрес.

Указатели могут использоваться в качестве операндов в арифметических выражениях. Так, например, если p - указатель, то p++ является адресом следующего элемента. Следовательно, конструкция p+n (p - указатель, n - целое число) задает адрес n-го элемента, на который указывает указатель p+n.

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

include <stdio.h>

void main(void) /*демонстрация объявления указателей*/

{ int *p,i; /* на объект типа int */

scanf("%d",&i);

p=&i; /* теперь р содержит адрес переменной i*/

printf("\ni=%d",i); /* печать значения переменной i */

printf("\n*p=%d",*p); /* печать значения по адресу p*/

}

К указателю типа void* применяются следующие операции:

= , == , != , > , < , <= , >=

Связь между указателями и массивами

В С(С++) между индексированием и адресацией существует тесная взаимосвязь. Доступ к элементам массива с помощью индексирования может быть заменен доступом к ним с использованием адресов. При этом второй вид доступа выполняется быстрее. Взаимосвязь указателей и массивов хорошо видна из приводимого ниже рисунка 9.

Выражение вида y=&a[0] присваивает переменной y адрес элемента a[0].

Выражение y+1 указывает на следующий элемент массива, при этом учитывается масштабирование, то есть выполняется приращение адреса с учетом

int a[10]; int *y;

X=a[0]

a

a[0]

y

X=*y

X=a[1]

a+1

a[1]

y+1

X=*(y+1)

. . .

X=a[9]

a+9

a[9]

y+9

X=*(y+9)

Рис. 9. Связь указателей и массивов

размеров памяти отводимой, под элемент. Так как имя массива является адресом его нулевого элемента, то выражение y=&a[0] может быть записано иначе y=a. Доступ к i-му элементу массива может быть осуществлен либо, используя имя массива a[i] и *(a+i), либо указатель *y и *(y+i). Наряду со сходством имени массива и указателей между ними существует различие. Указатель - это переменная и выражения вида y=a и y++ являются допустимыми. Имя массива - константа и выражения a=y, a++, y=&a являются ошибочными, так как значение константы не может быть изменено.