Ваш вопрос ошибочен, но я попытаюсь ответить на несколько его аспектов.
Во-первых, int
не является базовым типом для double
. Также не указатель на int
базовый тип для указателя на double
. Поэтому этот вопрос неверно.
Во-вторых, нет гарантии, что тип с плавающей точкой может хранить каждое значение int
. На практике это зависит от представления с плавающей запятой (сколько бит используется для представления мантиссы). Часто оказывается, что float
или double
может представлять некоторые из значений, которые могут быть int
, но не другие (для которых он хранит значение, которое является приблизительным). Это часть компромисса переменной с плавающей запятой, способной представлять нецелые значения в большем диапазоне, чем int
.
В-третьих, ваше описание «отображает их значения» неоднозначно. Если вы делаете
std::cout << f_var << ' ' << l_ptr << '\n';
или (более явно, не полагаясь на неявном преобразовании к аннулированию указателей)
std::cout << (void *)f_var << ' ' << (void *)l_ptr << '\n';
значения указателей (т.е. адрес они держат) будет напечатан. На практике выходы значений обычно будут одинаковыми - это их тип, который отличается, а не их значение. Но значения этих указателей являются адресом в памяти переменной x
, а не значением x
.
С другой стороны, если вы делаете
std::cout << *f_var << ' ' << *l_ptr << '\n';
результатом является неопределенное поведение, так как в настоящее время l_ptr
разыменовываются как будто это указывает на double
, несмотря указывая на int
. Результатом этого может быть что угодно (печать мусора, значения печати, которые вы не ожидаете, переформатирование жесткого диска, что-либо). На практике он, вероятно, пытается интерпретировать биты, которые составляют int
(т. Е. Переменную x
), как если бы они представляли значение с плавающей запятой. Поскольку биты в int
имеют различное значение от битов в double
(в представлениях с плавающей запятой есть мантисса и экспонента, поэтому double
может представлять значения, такие как 0.5E15
или 0.5E-3
), тот же набор бит представляет другое значение , Существует также морщина, которая, как правило, составляет double
, состоит из большего количества бит, чем int
. Таким образом, путем печати таким образом ваш код интерпретирует случайную память справа от x
как данные.
«Я хочу, чтобы указатель типа double указывал на указатель типа int, который указывает на другой var:« ... зачем? – Caninonos
Что вы ожидаете? –
Это очень плохая идея. Даже если он делает то, что вы намереваетесь в своей системе, вы можете получать разные результаты в зависимости от размера каждого типа (afaik). Вы должны указать, каковы ваши намерения; это похоже на проблему. – Carcigenicate