По вашим тегам (преобразование типов и неявное преобразование) вы ожидаете, что произойдет какое-то преобразование типов.Это не так.
Доступ к памяти с неверно напечатанным указателем не приводит к какому-либо преобразованию.Это просто интерпретирует память по-другому.Это включает в себя нарушение строгих правил псевдонимов, вызывающих неопределенное поведение.
И когда вы используете
printf ("call1 x:%.100f\n", x);//0.0000000.....
, вы обманываете свой компилятор.Вы обещаете передать значение double
(спецификатор формата %f
), которое обычно содержит 8 байтов, но затем вы передаете только 4 байта целого числа.Несоответствие в спецификаторе типа и типе параметра приводит к неопределенному поведению, и все ожидания безрезультатны.
Затем вы снова используете
printf ("p:%f\n", *p);//6.350000
, который прекрасно работает, когда вы предоставляете правильный двойной параметр.(здесь единственное неявное преобразование типов)
При компиляции этого кода ваш компилятор должен выводить некоторые предупреждения.И вы всегда должны слушать компилятор и разрешать предупреждения.