Приведение указателя: может ли указатель иметь значение? - PullRequest
0 голосов
/ 08 октября 2018

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

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

результат 100 100

1 Ответ

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

...