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

109 стр. Глава 8. Первое знакомство с указателями в С++

В компьютере класса Pentium размер указателя равен четырём байтам, независимо от того, на переменную какого типа он указывает[ 13 ].

Очень важно следить за соответствием типов указателей. Представьте, что может произойти, если компилятор в точности выполнит такой набор команд:

    int n1 ;

    int* pintVar ;

    pintVar = &n1 ;

    *pintVar = 100.0 ;

Последняя строка требует, чтобы по адресу, выделенному под переменную размером в четыре байта, было записано значение, имеющее размер восемь байтов. На самом деле ничего страшного не произойдёт, поскольку в этом случае компилятор приведёт 100.0 к типу int перед тем, как выполнить присвоение.

Привести переменную одного типа к другому явным образом можно так:

    int iVar ;

    double dVar = 10.0 ;

    iVar = ( int )dVar ;

Так же можно привести и указатель одного типа к другому:

    int* piVar ;

    double dVar = 10.0 ;

    double* pdVar ;

    piVar = ( int* )pdVar ;

Трудно предсказать, что может случиться, если сохранить переменные одного типа по адресам, выделенным под переменные другого типа. Сохранение переменных, имеющих большую длину, вероятно, приведёт к уничтожению переменных, расположенных рядом. Такая ситуация наглядно продемонстрирована с помощью программы Layout Error:

      /* LayoutError — демонстрирует результат неаккуратного обращения с указателями */

      #include <cstdio>

      #include <cstdlib>

      #include <iostream>

      using namespace std ;

      int main( int intArgc , char* pszArgs[ ] )

      {

                    /* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

            setlocale ( LC_ALL , ".1251" ) ;

        int upper = 0 ;

        int n = 0 ;

        int lower = 0 ;

          /* Вывод адресов каждой из переменных. Обратите внимание на расположение переменных в памяти компьютера */

        cout << "&upper = 0x" << &upper<< "\n" ;

        cout << "&n      = 0x" << &n  << "\n" ;

        cout << "&lower  = 0x" << &lower << "\n" ;

          /* Выводим значения объявленных переменных */

          cout << "upper = " << upper << "\n" ;

          cout << "n = " << n << "\n" ;

          cout << "lower = " << lower << "\n" ;

          /* Сохраняем значение типа double в памяти, выделенной для int */

          cout << "\nСохранение double в int\n\n" ;

        cout << "\nСохранение 13.0 по адресу &n\n\n" ; 

          double* pD = ( double* )&n ;

          *pD = 13.0 ;

          /* Показываем результаты */

          cout << "upper = " << upper << "\n" ;

          cout << "n = " << n << "\n" ;

          cout << "lower = " << lower << "\n" ;

          /* Пауза для того, чтобы посмотреть на результат работы программы */

          system ( "PAUSE" ) ; return 0 ;

      }

__________

13Размер указателя зависит не только от типа процессора, но и от операционной системы, используемого компилятора и так называемой модели памяти создаваемой программы. — Прим. ред.

_________________

110 стр. Часть 2. Становимся функциональными программистами

В первых трёх строках функции main( ) происходит объявление трёх переменных типа int. Допустим, что в памяти эти переменные находятся друг за другом.

Следующие три строки выводят значения этих переменных на экран. Не удивительно, что все три оказываются равными нулю. После этого происходит присвоение *pD = 13.0 ; , в результате которого число, имеющее тип double, записывается в переменную n, имеющую тип int. Затем все три переменные снова выводятся на экран.

вернуться

13

Размер указателя зависит не только от типа процессора, но и от операционной системы, используемого компилятора и так называемой модели памяти создаваемой программы.