Следующая программа демонстрирует использование оператора & и показывает расположение переменных в памяти.
/* Layout — демонстрация расположения переменных в памяти компьютера */
#include <cstdio>
#include <cstdlib>
#include <iostream>
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. Мой сын выполняет роль указателя — его можно спросить, в какой комнате отеля я нахожусь, и он даст точный ответ.
Вот псевдокод, описывающий данную ситуацию:
mySon = &DadsRoom ; /* Теперь сын знает комнату отца */
room = *mySon ; /* "Номер комнаты равен" */
Пример работы с операторами на С++ привёден в следующем листинге:
void fn( )
{
int intVar ;
int* pintVar ;
pintVar = &intVar ; /* Теперь pintVar указывает на intVar */
*pintVar =10 ; /* Сохраняет 10 в переменной типа int по адресу, находящемуся в pintVar */
}
Функция fn( ) начинается с объявления переменной intVar ; в следующей строке объявляется pintVar — указатель на переменную типа int.
Указатели объявляются как обычные переменные, но в объявление добавляется унарный оператор *, который может быть использован совместно с именем любого типа. В данной строке этот символ используется вместе с именем фундаментального типа int. Однако этот оператор может использоваться для добавления к любому имени переменной типа.