Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование.doc
Скачиваний:
9
Добавлен:
02.02.2015
Размер:
188.42 Кб
Скачать

Операции адресации и разадресации (&, *)

Для получения адреса какого – либо объекта используется операция адресации &.

int i;

int *ip = &i; //ip – адрес переменной i

Для доступа к величине по её адресу используется операция разадресации *.

int i = 5;

int *ip = &i;

cout << (*ip); //5

Конструкция *указатель является Lvalue.

1000 1004 1008 1012 1016 1020 1024 1028

int x, *p, *q

▄▄▄▄

?

▄▄▄▄

▄▄▄▄

?

?

▄▄▄▄

x

p

q

p = &x;

▄▄▄▄

?

▄▄▄▄

▄▄▄▄

1004

?

▄▄▄▄

*p = 125;

▄▄▄▄

125

▄▄▄▄

▄▄▄▄

1004

?

▄▄▄▄

q = p;

▄▄▄▄

125

▄▄▄▄

▄▄▄▄

1004

1004

▄▄▄▄

(*q) += 10;

▄▄▄▄

135

▄▄▄▄

▄▄▄▄

1004

1004

▄▄▄▄

Адресная арифметика

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

  • сложение с константой;

  • вычитание указателей (только одного типа);

  • инкремента и дикремента.

При этом автоматически учитывается размер адресуемых величин.

Адресная арифметика используется в основном при работе с адресными структурами, последовательно расположенными в памяти.

Операция инкремента (дикремента) увеличивает (уменьшает) указатель на величину sizeof (тип указателя). При сложении с константой указатель изменяется на величину, равную const * sizeof (тип указателя).

double *p = 1000;

p++; // p = p + sizeof (double) = p + 8 = 1008;

p+=10; // p = p + 10 * sizeof (double) = 1088;

Разность двух указателей равна разности их значений, делённой на размер их в байтах, т.е. количество элементов данного типа между ними. Разность двух указателей – это НЕ указатель, а целое число.

Сложение указателей не допускается.