Программирование. Принципы и практика использования C++ Исправленное издание, стр. 222

По существу, память компьютера можно рассматривать как последовательность байтов, пронумерованную от
0size-1Каждый тип имеет соответствующий тип указателя. Рассмотрим пример.
char ch = 'c';char* pc = &ch; // указатель на charint ii = 17;int* pi = ⅈ // указатель на intЕсли мы хотим увидеть значение объекта, на который ссылаемся, то можем применить к указателю оператор разыменования, унарный
*cout << "pc==" << pc << "; содержимое pc==" << *pc << "\n";cout << "pi==" << pi << "; содержимое pi==" << *pi << "\n";Значением
*pcc*pi17pcpichiiОператор разыменования также может стоять в левой части оператора присваивания.
*pc = 'x'; // OK: переменной char, на которую ссылается // указатель pc, // можно присвоить символ 'x'*pi = 27; // OK: указатель int* ссылается на int, поэтому *pi — // это int*pi = *pc; // OK: символ (*pc) можно присвоить переменной // типа int (*pi)
intintint i = pi; // ошибка: нельзя присвоить объект типа int* // объекту типа intpi = 7; // ошибка: нельзя присвоить объект типа int объекту // типа int*Аналогично, указатель на
charchar*intint*pc = pi; // ошибка: нельзя присвоить объект типа int* // объекту типа char*pi = pc; // ошибка: нельзя присвоить объект типа char* // объекту типа int*Почему нельзя присвоить переменную
pcpicharintchar ch1 = 'a';char ch2 = 'b';char ch3 = 'c';char ch4 = 'd';int* pi = &ch3; // ссылается на переменную, // имеющую размер типа char // ошибка: нельзя присвоить объект char* объекту // типа int* // однако представим себе, что это можно сделать*pi = 12345; // попытка записи в участок памяти, имеющий размер // типа char*pi = 67890;Как именно компилятор размещает переменные в памяти, зависит от его реализации, но, скорее всего, это выглядит следующим образом.

Если бы компилятор пропустил такой код, то мы могли бы записать число
12345&ch3ch2ch4pi*pi=6789067890В редких ситуациях, когда нам требуется преобразовать переменную типа
intreinterpret_castИтак, мы очень близки к аппаратному обеспечению. Для программиста это не очень удобно. В нашем распоряжении лишь несколько примитивных операций и почти нет библиотечной поддержки. Однако нам необходимо знать, как реализованы высокоуровневые средства, такие как класс
vectorvector