实际上这行代码`ptr =(char*)&a;`有用吗?

Ant*_*t's 3 c

我有代码:

#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++);
}
Run Code Online (Sandbox Code Playgroud)

我把输出作为102 102 -90 64.我无法预测它是怎么来的,我对这条线感到困惑ptr=(char *)&a;.任何人都可以解释一下它的作用吗?和其他变量一样,代码会*ptr++增加吗?或者对于这种情况有指针的任何其他规则.

我是C的新手,所以用简单的术语解释答案.提前致谢.

Fre*_*Foo 6

该行将a表示的地址转换&a为a char*,即指向字符/字节的指针.然后printf循环打印a十进制的四个组成字节的值.

(顺便说一句,如果循环已经过,它会更整洁

for (i=0; i<sizeof(a); i++)
    printf("%d ", ptr[i]);
Run Code Online (Sandbox Code Playgroud)

)


Jon*_*rdy 6

这被称为演员.在C中,使用强制转换可以将值从一种类型转换或重新解释为另一种类型.当你拿到地址时float,你会得到一个float*; 将其转换为a char*会为您提供指向内存中相同位置的指针,但假装其中存在的是char数据而不是float数据.

sizeof(float)4,所以在印刷四个字节从该位置开始给你组成浮动的字节数,根据IEEE-754单精度格式.某些字节的高位设置,因此当解释为signed char然后转换int为显示时,由于它们的二进制补码表示,它们显示为负值.

表达式*ptr++相当于*(ptr++),首先递增ptr然后取消引用其先前的值; 您可以将其视为同时解除引用和推进ptr.