То, что здесь происходит, вы перечитываете a
, то есть int
, принудительно в double
.
Позвольте мне разобрать это:
&a
получает указатель типа int *
на переменную a
.
Затем, с помощью (double *)
вы преобразуете этот указатель в тип double *
.
Наконец, с помощью *
вы разыменовываете приведенный указатель на double
.
Итак, все вместе, вы берете указатель на a
, преобразовывает его в double*
, разыменовываете его и присваиваете значениепеременная d1
.
Это известно как определение типа, и, как упоминали другие, это плохо, потому что два типа int
и double
, вероятно, занимают различное количество байтов в памяти..
Предположим, что int
определяется как 4 байта в вашей системе, а double
равно 8 байтов.Тогда это проблема, потому что вы говорите своей системе: «Послушайте, вы можете прочитать следующие 8 байтов по этому адресу вместо 4 байтов, которые на самом деле являются действительными данными».Кто знает, что находится в следующих 4 байтах?Поведение - undefined , и вы в основном гарантированно читаете мусор.