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
Размер указателя зависит не только от типа процессора, но и от операционной системы, используемого компилятора и так называемой модели памяти создаваемой программы.