Typecasting指向浮点指针的指针
我正在尝试做以下事情
int a[8]={1,2,3,4,5,6,7,8}; printf("%f\n", *(float *)a); printf("%f\n", *((float *)a+1)); printf("%f\n", *((float *)a+2)); printf("%f\n", *((float *)a+3)); printf("%f\n", *((float *)a+4)); printf("%f\n", *((float *)a+5)); printf("%f\n", *((float *)a+6)); printf("%f\n", *((float *)a+7));
我明白了
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
我试图以这种方式打印元素的原因是因为,我想将指向数组的int指针强制转换为浮点指针并将其作为另一个函数的参数传递给float *
。
看来这不行。 有人可以解释为什么这不起作用?
int *ptr; function((float *)ptr);
如果我这样做,该函数不会读取指针正确指向的值..只返回0.0000
。
这是不正确的。 int
和float
不保证具有相同的对齐方式。
请记住:投射值并投射指针是不同的场景。 转换指针会改变引用类型值的方式,这几乎肯定会导致大多数情况下的错位。
根据C11
标准文件,章节§6.3.2.3
指向对象类型的指针可以转换为指向不同对象类型的指针。 如果对于引用的类型,结果指针未正确对齐( 68) ,则行为未定义。
在你的情况下,可能会解决问题
printf("%f\n", (float)*a); //cast the value, not the pointer
您不能将指向int
的指针int
转换为指向float
的指针,并期望将您的值转换为浮点表示forms中的相应数字。 转换单个值有效,但通过更改指针类型进行转换不会改变表示forms。
如果需要一个float
数组,请声明一个float
数组,并一次转换一个元素:
float b[8]; for (int i = 0 ; i != 8 ; i++) { b[i] = a[i]; } func_expects_float(b, 8);
将指针强制转换为float不会将整数转换为浮点数。 转换只是告诉机器使用指针指向的内存位置的内容作为浮点值而不是整数值。 但它不会将值从整数表示更改为浮点表示。
你可能会尝试:
printf( "%f\n", 1.0f * a[0]); printf( "%f\n", 1.0f * a[1]); ....
== ==或
printf( "%f\n", *(a+0) * 1.0f ); printf( "%f\n", *(a+1) * 1.0f ); ....