Typecasting指向浮点指针的指针

时间:2015-05-16 14:06:42

标签: c pointers floating-point int type-conversion

我试图做以下事情

JSONArray jArray = new JSONArray(); 
jArray.put(c.getLong(0));
jArray.put(c.getLong(6));
list.add(jArray);

我得到了

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));

我试图以这种方式打印元素的原因是因为,我想将指向数组的int指针强制转换为浮点指针,并将其作为另一个函数的参数传递给{{{ 1}}。

这似乎不太好用。有人可以解释为什么这不起作用?

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

如果我这样做,该函数不会读取指针正确指向的值..只返回float *

4 个答案:

答案 0 :(得分:4)

这不正确。 intfloat不保证具有相同的对齐方式。

请记住:投射值并投射指针是不同的场景。转换指针会改变方式以引用类型值,这几乎可以 导致大多数< / em>的案例。

根据C11标准文件,§6.3.2.3

一章
  

指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未正确对齐引用类型 68),则行为未定义。

在您的情况下,解决方法可能是

printf("%f\n", (float)*a);  //cast the value, not the pointer

答案 1 :(得分:1)

您不能将指向int的指针转换为指向float的指针,并期望将您的值转换为浮点表示中的相应数字。转换单个值有效,但通过更改指针类型进行转换不会改变表示形式。

如果您需要float的数组,请声明一个float的数组,并一次转换一个元素:

float b[8];
for (int i = 0 ; i != 8 ; i++) {
    b[i] = a[i];
}
func_expects_float(b, 8);

答案 2 :(得分:0)

将一个int指针转换为float不会将整数转换为浮点数。转换只是告诉机器使用指针指向的内存位置的内容作为浮点值而不是整数值。但它不会将值从整数表示更改为浮点表示。

答案 3 :(得分:0)

你可以试试:

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 ); 
....