Переменная intRandy
может находиться по адресу 0x100 , a floatReader — по адресу 0x180 ( адреса в памяти принято записывать в шестнадцатеричном виде ). Понятно, что эти переменные могут находиться где угодно, и только компьютер по долгу службы точно знает, где именно они располагаются — и то только в процессе выполнения программы.Здесь можно провести определённую аналогию с отелем. Когда вы бронируете место, вам может быть предоставлен, например, номер 0x100 ( я понимаю, что номера в отеле никто не записывает в шестнадцатеричной форме, но отвлечёмся на минуту от этого факта ). Ваш друг при бронировании может оказаться в номере 0х180 — так и каждая переменная получает место в памяти при создании ( немного подробнее об этом будет рассказано далее, когда мы будем рассматривать область видимости ).
►Адресные операторы...106
В табл. 8.1 приведены два оператора, связанные с указателями. Оператор &
по сути говорит "скажи мне номер комнаты в отеле", а * — "кто в этой комнате живёт"._________________
106 стр. Часть 2
. Становимся функциональными программистами
Таблица 8.1. Адресные операторы
_________________
Оператор — Описание
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
&
— ( унарный ) Адрес *
— ( унарный ) ( В выражении ) то, на что указывает указатель *
— ( унарный ) ( В объявлении ) указатель на ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Следующая программа демонстрирует использование оператора & и показывает расположение переменных в памяти.
/* Layout — демонстрация расположения переменных в памяти компьютера */
#include
#include
#include
using namespace std ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
int end ;
int n ;
long l ;
float f ;
double d ;
/* Вывод в шестнадцатеричном формате */
cout.setf( ios::hex ) ;
cout.unsetf( ios::dec ) ;
/* Вывод адресов каждой из переменных. Обратите внимание на расположение переменных в памяти компьютера */
cout << "--- = " << &
end << " \n" ; cout << "&
n = " << &n <<" \n" ; cout << "&
l = " << &l <<" \n" ; cout << "&
f = " << &f <<" \n" ; cout << "&
d = " << &d <<" \n" ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Программа объявляет ряд переменных, к которым затем применяется оператор &
для того, чтобы получить их местоположение в памяти. Вот как выглядит результат выполнения этой программы, скомпилированной Dev-C++.
--- = 0x28ff34
&
n = 0x28ff30 &
l = 0x28ff2c &
f = 0x28ff28 &d = 0x28ff20
Press any key to continue...
_________________
107 стр. Глава 8
. Первое знакомство с указателями в С++
«Результат выполнения программы на вашем компьютере может отличаться от приведённого. Абсолютные адреса переменных зависят от массы различных факторов. Вообще говоря, результаты могут отличаться при различных запусках одной и той же программы.»
[
Советы]Обратите внимание на то, что переменная n
располагается ровно в 4 байтах от первой объявленной переменной end. Переменная l располагается ещё на 4 байта ниже, а переменная типа double занимает 8 байт. Для каждой переменной выделяется память, необходимая для её типа.
«Стандарт С++ не требует от компилятора последовательного "беспросветного" размещения переменных в памяти. Dev-C++ может разместить переменные в памяти и по-другому.»
[
Атас!]►Использование указателей...108
Переменная-указатель содержит адрес, обычно это адрес другой переменной. Используя аналогию с отелем: я могу сказать сыну, что во время путешествия я буду в комнате 0x100. Мой сын выполняет роль указателя — его можно спросить, в какой комнате отеля я нахожусь, и он даст точный ответ.
Вот псевдокод, описывающий данную ситуацию: