Вы можете создать указатель из целого числа с reinterpret_cast
.
Однако указатель, который не указывает на существующий объект (или 1 после последнего элемента в массиве с объектом, который считаетсяединственный элемент в воображаемом массиве для этой цели (или нулевой указатель) имеет недопустимое значение указателя. Разыменование - это UB, а другие операции с недопустимыми значениями указателя зависят от реализации, поэтому вам необходимо убедиться, что ваш компилятор разрешает операции, которые вы делаете с этими указателями.
void* p = reinerpret_cast<void*>(0x1000); // invalid pointer,
// operations on it are implementation defined
§6.7.2 Составтипы [basic.compound]
[...] Каждое значение типа указателя является одним из следующих:
3.1 - указатель на объект или функцию (указатель, как говорят, указывает на объект или функцию)или
3.2 - указатель за концом объекта (8.5.6), или
3.3 - значение нулевого указателя (7.11) для этого типа, или
3.4 - недопустимое значение указателя
§8.5.1.10 Переинтерпретация приведения [expr.reinterpret.cast]
Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой для его хранения. Функция отображения определяется реализацией. [...] Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно в тот же тип указателя, будет иметь свое первоначальное значение;в противном случае сопоставления между указателями и целыми числами определяются реализацией.
Вы можете преобразовать целое число в указатель, но если полученное значение указателя не указывает на существующий объект (или одинпосле объекта) результирующий указатель имеет недопустимое значение.
Теперь о том, что вы можете делать с недопустимыми указателями:
§6.6.4 Срок хранения [basic.stc]
[...] Переадресация через недопустимое значение указателя и передача недопустимого значения указателя в функцию освобождения имеют неопределенное поведение. Любое другое использование недопустимого значения указателя имеет поведение, определяемое реализацией
35 35) Некоторые реализации могут определять, что копирование неверного значения указателя вызывает системную ошибку времени выполнения.
Это сообщение было сильно отредактировано, потому что оно было неверным в его первых итерациях. Огромное спасибо сообществу за исправление и вызов мне.