Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 Операция получения адреса & - ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн - Studbook

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 «Функции»).

 

4