В C вы можете использовать как простые типы данных, такие как int
, float
, так и указатели на них.
Теперь я бы предположил, что если вы хотите конвертировать из указателя в один тип в значение другого типа (например, от *float
до int
), порядок литья и разыменования не имеет значения. То есть что для переменной float* pf
у вас есть (int) *pf == *((int*) pf)
. Подобная коммутация в математике...
Однако, похоже, это не так. Я написал тестовую программу:
#include <stdio.h>
int main(int argc, char *argv[]){
float f = 3.3;
float* pf = &f;
int i1 = (int) (*pf);
int i2 = *((int*) pf);
printf("1: %d, 2: %d\n", i1, i2);
return 0;
}
а в моей системе выход
1: 3, 2: 1079194419
Таким образом, приведение указателя, похоже, будет отличаться от значения.
Почему? Почему вторая версия не делает то, что я думаю, что она должна?
И это зависит от платформы, или я каким-то образом вызываю поведение undefined?