Typecasting int pointer to float pointer

你说的曾经没有我的故事 提交于 2019-12-23 21:30:01

问题


I'm trying to do the following

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

I get

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

The reason why I'm trying to print the elements in this way is because, I want to cast the int pointer to the array to the float pointer and pass it as a parameter for another function which only takes float *.

It seems that this does not work well. Can someone explain why this is not working?

int *ptr;
function((float *)ptr);

If I do this the function does not read the values the pointer is pointing to properly.. just returning 0.0000.


回答1:


This is not correct. int and float are not guaranteed to have the same alignment.

Remember: Casting a value and casting a pointer are different scenarios. Casting a pointer changes the way to refer to the type value, which can almost certainly result in a mis-alignment in most of the cases.

As per C11 standard document, chapter §6.3.2.3

A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned68) for the referenced type, the behavior is undefined.

In your case, a work-around may be

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



回答2:


You cannot cast a pointer to int to a pointer to float, and expect to get your value converted to the corresponding number in floating point representation. Casting a single value works, but casting by changing a pointer type does not alter the representation.

If you need an array of floats, declare an array of floats, and cast one element at a time:

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



回答3:


Casting an int pointer to a float doesn't convert the integer to a floating point number. Casting just tells the machine to use the contents of the memory location pointed to by the pointer as floating point value instead of an integer value. But it doesn't change the value from integer representation to floating point representation.




回答4:


you might try:

printf( "%f\n", 1.0f * a[0]); 
printf( "%f\n", 1.0f * a[1]); 
.... 

==or==

printf( "%f\n", *(a+0) * 1.0f ); 
printf( "%f\n", *(a+1) * 1.0f ); 
....


来源:https://stackoverflow.com/questions/30276645/typecasting-int-pointer-to-float-pointer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!