关于C#:将int指针转换为float指针

Typecasting int pointer to float pointer

我正在尝试执行以下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int a[8]={1,2,3,4,5,6,7,8};

printf("%f
"
, *(float *)a);
printf("%f
"
, *((float *)a+1));
printf("%f
"
, *((float *)a+2));
printf("%f
"
, *((float *)a+3));
printf("%f
"
, *((float *)a+4));
printf("%f
"
, *((float *)a+5));
printf("%f
"
, *((float *)a+6));
printf("%f
"
, *((float *)a+7));

我懂了

1
2
3
4
5
6
7
8
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

我尝试以这种方式打印元素的原因是,我想将指向数组的int指针转换为float指针,并将其作为另一个仅需float *的函数的参数传递。

看来这不能很好地工作。 有人可以解释为什么这行不通吗?

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

如果执行此操作,函数将无法读取指针正确指向的值..仅返回0.0000


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

请记住:强制转换值和强制转换指针是不同的方案。强制转换指针会更改引用类型值的方式,在大多数情况下,几乎可以肯定会导致未对齐。

根据C11标准文档,第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.

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

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


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

如果需要一个float s数组,则声明一个float s数组,然后一次转换一个元素:

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


您可以尝试:

1
2
3
4
5
printf("%f
"
, 1.0f * a[0]);
printf("%f
"
, 1.0f * a[1]);
....

==或==

1
2
3
4
5
printf("%f
"
, *(a+0) * 1.0f );
printf("%f
"
, *(a+1) * 1.0f );
....

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