Приведение указателя: может ли указатель иметь значение?

Указатель может иметь значение?? так в каком случае это используется

int num=100;
int* iptr=NULL;
iptr=reinterpret_cast<int*>(num);
printf("%d \n",num);
printf("%d \n",num);

результат 100 100

1 ответ

  1. Отображения между указателями и целыми числами определяются реализацией.
  2. Преобразование целого числа в указатель с помощью reinterpret_cast не будет безопасно полученным значением указателя, кроме как при определенных условиях. Эти условия не выполняются в вашем примере.

Цитата из проекта CPP (N4713):

8.5.1.10 Переосмыслить приведение
...
6. Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно в тот же тип указателя, будет иметь свое первоначальное значение; Отображения между указателями и целыми числами определяются реализацией. [Примечание: за исключением случаев, описанных в 6.6.4.4.3, результатом такого преобразования не будет безопасно полученное значение указателя. —Конечная записка]

Условия для Безопасно полученных указателей.

6.6.4.4.3 Безопасно полученные указатели
...
2 Значение указателя является надежно полученным указателем на динамический объект, только если он имеет тип указателя объекта и является одним из следующих:
(2.1) - значение, возвращаемое вызовом реализации стандартной библиотеки C++::operator new(std::size_t) или:: operator new (std:: size_t, std:: align_val_t);
(2.2) - результат взятия адреса объекта (или одного из его подобъектов), обозначенного lvalue, в результате косвенного обращения через безопасно полученное значение указателя;
(2.3) - результат хорошо определенной арифметики указателя с использованием безопасно полученного значения указателя;
(2.4) - результат четко определенного преобразования указателя в безопасно полученное значение указателя;
(2.5) - результат reinterpret_cast из безопасно полученного значения указателя;
(2.6) - результат reinterpret_cast целочисленного представления значения указателя, полученного безопасно;
(2.7) - значение объекта, значение которого было скопировано из прослеживаемого объекта указателя, где во время копирования исходный объект содержал копию безопасно полученного значения указателя.

Другие вопросы по тегам