我有代码:
#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的新手,所以用简单的术语解释答案.提前致谢.
该行将a表示的地址转换&a为a char*,即指向字符/字节的指针.然后printf循环打印a十进制的四个组成字节的值.
(顺便说一句,如果循环已经过,它会更整洁
for (i=0; i<sizeof(a); i++)
printf("%d ", ptr[i]);
Run Code Online (Sandbox Code Playgroud)
)
这被称为演员.在C中,使用强制转换可以将值从一种类型转换或重新解释为另一种类型.当你拿到地址时float,你会得到一个float*; 将其转换为a char*会为您提供指向内存中相同位置的指针,但假装其中存在的是char数据而不是float数据.
sizeof(float)是4,所以在印刷四个字节从该位置开始给你组成浮动的字节数,根据IEEE-754单精度格式.某些字节的高位设置,因此当解释为signed char然后转换int为显示时,由于它们的二进制补码表示,它们显示为负值.
表达式*ptr++相当于*(ptr++),首先递增ptr然后取消引用其先前的值; 您可以将其视为同时解除引用和推进ptr.
| 归档时间: |
|
| 查看次数: |
9262 次 |
| 最近记录: |