Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЛАВА 7 Указатели.doc
Скачиваний:
25
Добавлен:
29.02.2016
Размер:
143.36 Кб
Скачать

Операция адреса

Для получения адреса переменной используется операция адреса (&). Она представляет собой унарную операцию, результатом выполнения которой является адрес переменной в памяти – своего операнда.

Рассмотрим связь между именами, адресами и значениями переменных. Предполагается, что в программе использована, например, такая последовательность объявлений:

int b =-5;

int c = 27;

double d = 2.15;

cout<<&b<<' '<<&c<<' '<<&d<<endl;

cout<<b<<' '<<c<<' '<<d<<endl;

Результат:

Имя переменной: b c d

Адрес: 0064fe00 0064fdfc 0064fdf4

Значение в памяти: -5 27 2.15

Переменная целого типа int занимает четыре байта, переменная типа doubleвосемь байтов памяти. При таких требованиях к памяти в данном примере &b = 0064fe00, &c = 0064fdfc, &d = 0064fdf4.

Следует отметить, что адреса имеют целочисленные беззнаковые значения, и их можно обрабатывать как целочисленные величины.

Используя операцию адреса (&), можно получить адрес любых переменной (как глобальных, так и локальных), массивов и других данных. Операцию & нельзя применять к выражениям и константам, поэтому записи

&(x + 6) и &15 не допустимы.

Переменная-указатель хранит адрес ячейки памяти, который можно получить, используя операцию адреса (&):

int x = 5; int *p = &x;

Указателю разрешено ссылаться только на данные заданного типа. Это требование обусловлено тем, что данные разных типов занимают разное количество байтов памяти компьютера. Поскольку указатели ограничены заданным типом данных, компилятор осуществляет проверку соответствия типов:

float * p; char c; p = &c; //ошибка компиляции

Операция разыменования

Использование указателей для получения доступа к данным, которые эти указатели адресуют, называется разыменованием указателя.

Выражение *p разыменовывает указатель, разрешая доступ к содержимому ячейки по адресу p:

int x = 5; int *p = &x;

cout<<x<<' '<<*p<<endl; // 5 5

Из примера видно, что после присваивания указателю p адреса переменной x, переменная x и указатель p оказываются связанными между собой, и к значению переменной x можно обращаться непосредственно, через имя переменной x, или косвенно, через указатель p.

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

Разыменованные указатели на переменные позволяют производить над ними те же действия, что и над обычными переменными. Например, присвоив указателю адрес конкретной области памяти (ячейки памяти), можно с помощью операции разыменования не только получать его содержимое, но и изменять его, т.е. присваивать значения:

*p = 10; // запись значения 10 по адресу, хранящемуся в p

После выполнения этого оператора значение переменной x, на которую указывает указатель p, станет равным 10.

С помощью операции разыменования (*) значение переменной-указателя можно использовать в математических и логических выражениях:

к = 3 + x * 7; и k = 3 + (*p) * 7; – записи равнозначны.

В том случае, когда требуется адрес переменной, операция адреса (&) используется напрямую, без операции разыменования(*):

cout<<x<<" "<<&x<<endl;

Основной смысл применения указателя состоит в возможности доступа к данным, на которые он указывает.