ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн
Операция получения адреса &
Мы можем получить адрес переменной, используя операцию получения адреса &. Рассмотрим небольшую программу VARADDR, показывающую, как это сделать:
// varaddr.cpp // адрес переменной #include <iostream> using namespace std;
int main ( )
{
int var1 = 11; // определим три переменных
int var2 = 22; // и присвоим им некоторые значения
int var3 = 33;
cout << &var1 << endl // напечатаем адреса этих переменных
<< &var2 << endl
<< &var3 << endl;
return 0;
}
В этой простой программе определены три целочисленные переменные, ко- торые инициализированы значениями 11, 22 и 33. Мы выводим на экран адреса этих переменных.
Реальные адреса, занятые переменными в программе, зависят от многих фак- торов, таких, как компьютер, на котором запущена программа, размер оператив- ной памяти, наличие другой программы в памяти и т. д. По этой причине вы, скорее всего, получите совершенно другие адреса при запуске этой программы (вы даже можете не получить одинаковые адреса, запустив программу несколь- ко раз подряд). Вот что мы получили на нашей машине:
0x8f4ffff4- адрес переменной var1 0x8f4ffff2- адрес переменной var2 0x8f4ffff0- адрес переменной var3
Запомните, что адреса переменных — это не то же самое, что их значение. Содержимое трех переменных — это 11, 22 и 33. На рис. 10.2 показано размеще- ние трех переменных в памяти.

Рис. 10.1. Адреса в памяти

Рис. 10.2. Адреса и содержимое переменных
Использование операции << позволяет показать адреса в шестнадцатеричном представлении, что видно из наличия префикса 0x перед каждым числом. Это обычная форма записи адресов памяти. Не беспокойтесь, если вы не знакомы с шестнадцатеричной системой. Вам всего лишь нужно помнить, что каждая пе- ременная имеет уникальный адрес. Однако вы могли заметить в выводе на дис- плей, что адреса отличаются друг от друга двумя байтами. Это произошло пото- му, что переменная типа int занимает два байта в памяти (в 16-битной системе). Если бы мы использовали переменные типа char, то значения адресов отлича- лись бы на единицу, так как переменные занимали бы по 1 байту, а если бы мы использовали тип double, то адреса отличались бы на 8 байтов.
Адреса расположены в убывающем порядке, потому что локальные перемен- ные хранятся в стеке, где адреса располагаются по убыванию. Если же исполь- зовать глобальные переменные, то их адреса располагаются в порядке возраста- ния, так как глобальные переменные хранятся в куче, где адреса располагаются по возрастанию. Но вас не должны сильно волновать эти детали, так как компи- лятор скрывает от вас такие подробности.
Не путайте операцию адреса переменной, стоящую перед ее именем, и опера- цию ссылки, стоящую за именем типа в определении или прототипе функции (ссылки мы обсуждали в главе 5 «Функции»).
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
