/* Выводим значения объявленных переменных */
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 . Затем все три переменные снова выводятся на экран.
После записи действительного числа в целочисленную переменную n переменная upper оказалась "забитой" каким-то мусором, что видно из результата работы программы:

upper = 0
n = 0
lower = 0
Сохранение double в int
upper = 1076494336
n = 0
lower = 0
Press any key to continue...
На языке домов и адресов эта программа будет выглядеть так:
house* houseAddress = & "123 Main Street" ;
hotel* hotelAddress ;
hotelAddress = ( hotel* )houseAddress ;
*hotelAddress = TheRitz ;
Указатель houseAddress инициализирован как указатель на мой дом. Переменная hotelAddress содержит адрес отеля. После этого вместо адреса моего дома записывается адрес отеля. Затем отель "Ритц" устанавливается по адресу моего дома. Однако поскольку "Ритц" куда больше моего дома, не удивительно, что он уничтожит не только мой дом, но и дома моих соседей ( хоть что-то приятное в результате ошибки! ).
Типизация указателей предохраняет программиста от неприятностей, связанных с сохранением данных большего размера в меньшем объёме памяти. Присвоение *pintVar = 100.0 не вызывает никаких проблем, поскольку С++ известно, что pintVar указывает на целочисленную переменную и приводит 100.0 перед присвоением к тому же типу.
►Передача указателей функциям...111
Одним из путей использования указателей является передача аргументов функции. Для того чтобы понять всю важность этого метода, необходимо разобраться, как происходит передача аргументов функциям.
_________________
111 стр. Глава 8. Первое знакомство с указателями в С++
Передача аргументов по значению...112
Вы могли заметить, что обычно нельзя изменить значение переменной, которая передавалась функции как аргумент. Рассмотрим следующий фрагмент кода:
void fn( intArg )
{
int intArg = 10 ;
/* Здесь значение intArg равно 10 */
}
void parent( void )
{
int n1 = 0 ;
fn( n1 ) ;
/* Здесь n1 равно 0 */
}
Функция parent( ) инициализирует переменную n1 нулём. После этого значение n1 передаётся в качестве аргумента функции fn( ) . В fn( ) переменной intArg присваивается значение 10 , тем самым в fn( ) осуществляется попытка изменить аргумент функции. Поскольку в качестве аргумента выступает переменная n1 , можно ожидать, что после возврата в parent( ) эта переменная должна иметь значение 10. Тем не менее n1 остаётся равной 0.
Дело в том, что С++ передаёт функции не переменную, а значение, которое в момент вызова функции находится в переменной. При вызове функции происходит вычисление значения передаваемого функции выражения, даже если это просто переменная.

«Некоторые программисты, стараясь не быть многословными, говорят что-то вроде "передаём переменнуюх функцииfn( ) ". На самом деле это означает, что функцииfn( ) передаётся значение выражениях .»
Читать дальше