Выбрать главу

Следующая программа демонстрирует использование оператора & и показывает расположение переменных в памяти.

    /* 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. Однако этот оператор может использоваться для добавления к любому имени переменной типа.