Ранее я немного рассказал о работе с указателями в С++, сегодня продолжу.
При объявлении типизированного указателя с его помощью можно будет работать с данными, имеющими размер указанного типа. Хотя с некоторыми процессорами и операционными системами всегда будет выделено 4 байта, рассчитывать на это не стоит. Поэтому важно следить за соответствием типов указателей.
Пример:
double fNum;
int* P1;
fNum = 500.0;
P1 = &fNum; //Ошибка компиляции
Здесь мы пытаемся в указатель, который предназначен для работы с числами размером 4 байта, записать адрес переменной, которая занимает 8 байтов. И это приведёт к ошибке времени компиляции - программа не будет создана.
Если же мы сделаем так:
int iNum;
double fNum;
int* P1;
P1 = &iNum;
*P1 = 500.0;
то ничего страшного не произойдёт. Просто компилятор автоматически приведёт число 500.0 к целому типу int перед присваиванием.
Также обратите внимание на то, что перед использованием указателя мы получаем в него адрес какой-то переменной типа int. Если этого не сделать, или не выделить память другим способом, то произойдёт ошибка времени выполнения, так как указатель будет пустым (не будет ссылаться ни на какую область памяти).
При желании можно привести тип явно:
fNum = 100.0;
*P1 = (int)fNum;
Также можно указатель одного типа привести к другому:
int iNum;
double fNum;
int* P1;
double* P2;
P1 = &iNum;
P2 = &fNum;
P1 = (int*)P2;
Ну и картинка для наглядности:
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.