我有代码:
#include<stdio.h>
void main(){
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
我的输出为102 102 -90 64
。我无法预测它是怎么来的,我对这一行ptr=(char *)&a;
感到困惑。任何人都可以解释一下它的作用吗?和其他变量一样,代码*ptr++
递增?或者对于这种情况有指针的任何其他规则。
我是C的新手,所以用简单的语言解释答案。提前谢谢。
答案 0 :(得分:6)
该行将a
的地址(表示为&a
)转换为char*
,即指向字符/字节的指针。然后printf
循环以十进制格式打印a
的四个组成字节的值。
(顺便说一下,如果循环已经
,它会更整洁for (i=0; i<sizeof(a); i++)
printf("%d ", ptr[i]);
)
答案 1 :(得分:6)
这称为cast。在C中,使用强制转换可以将值从一种类型转换或重新解释为另一种类型。当您获取float
的地址时,您会获得float*
;将其转换为char*
会为您提供指向内存中相同位置的指针,但假装其中存在char
数据而不是float
数据。
sizeof(float)
是4
,因此根据IEEE-754 single-precision format,从该位置开始打印四个字节可以得到组成浮点数的字节。有些字节设置了高位,因此当解释为signed char
然后转换为int
进行显示时,它们会因two's-complement representation而显示为负值。
表达式*ptr++
相当于*(ptr++)
,它首先递增ptr
,然后取消引用其先前的值;您可以将其视为同时取消引用和推进ptr
。
答案 2 :(得分:2)
第ptr=(char *)&a;
行将float
变量的地址强制转换为char
类型的指针。因此,您现在将float的4个字节解释为单个字节,使用for
循环打印该值。
语句*ptr++
在读取其值后递增指针,这意味着,您读取指向的值(浮点数的单个字节),然后将指针前移一个字节的偏移量。 / p>
答案 3 :(得分:1)
&a
获取a
的地址,也就是说,它会生成类型为float *
的指针。然后将类型为float *
的此指针强制转换为类型为char *
的指针。
由于sizeof(char) == 1
,a
现在可以通过ptr
看作一个字节序列。
当您想抽象出变量的类型并将其视为有限的字节序列时,这非常有用,尤其适用于序列化和散列。