В 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
Таким образом, приведение указателя работает иначе, чем приведение значения.
Почему это? Почему вторая версия не работает так, как мне кажется?
И это зависит от платформы, или я как-то вызываю неопределенное поведение?