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

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

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

результат
100
100

-3

Решение

  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) — значение объекта, значение которого было скопировано из прослеживаемого объекта указателя, где во время копирования исходный объект содержал копию безопасно полученного значения указателя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]