Размер указателя не имеет ничего общего с размером элемента, на который он указывает!
4-байтовый указатель может без проблем указывать на элемент размером 8 или 32 байта или любой другой размер.
Я спрашиваю, потому что на моей машине sizeof (void *) равен 4, а sizeof (double) равен 8, приведение одного к другому, похоже, должно привести к проблеме
Что ж, если вы приведете 4-байтовый указатель к 8-байтовому двойному символу, это будет серьезной проблемой. Однако это , а не , что делает ваш код.
Это то, что делает код:
double a = * (double *)(var);
| \--------------/
| This casts a void pointer to a double pointer
|
--> This dereferences the double pointer, i.e. reads the value of the pointed
to element (aka the pointed to double)
Поскольку указатель void был создан из адреса двойное, совершенно законно привести его к двойному указателю и совершенно законно, чтобы прочитать значение указанного элемента. Другими словами - во время вызова функции у вас есть неявное приведение двойного указателя к пустой указатель , а внутри функции пустой указатель возвращается к двойной указатель . Совершенно законный C код.
С дополнительным шагом ваш код эквивалентен:
void func1(void *var)
{
double *pd = (double *)var;
double a = *pd;
}
, что делает его немного более понятным.