问题
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 float
s, declare an array of float
s, 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