例:有以下变量:x 为 float型,y为in型, s 为 short, 请用C语言程序实现:可输入对应的变量值,输出其在内存中存储的每个字节的内容。比如,x=-12.5, 输出对应存储4字节内容及每个字节对应的地址。
刚看题目可能有点晕,但把题目多读几遍后,即明白若变量int x=127,则先找出x由几个字节所存储,比如4,再并找到x的存储头地址,对应依次输出x所有字节所指向(存储)的内容。
······
初学者的话是不是还有点晕?没事,先直接上代码
我们以int x=127为例,在C语言中实现。
#include<stdio.h>
int main()
{
int x;
char *c;
x=127;
c=(char*)&x;
for(int i=0;i<sizeof(x);i++)
{
printf("%x \t %x \n",(c+i),*(c+i));
}
return 0;
}
这里再多补充解释一句,如何输出对应存储4字节内容及每个字节对应的地址?先找到第一个字节的头地址,然后依次++输出相对应的地址和该字节存储的内容。
下面来对可能有疑惑的几个点一一解释
1.
c=(char*)&x;
这句话是什么意思?
先取x的首地址,然后强制转换为char指针类型。本质上还是把x的地址给c,只不过现在的类型是char而不是int。
那为什么要转换为char呢?直接用int不好吗?
这就涉及到接下来要进行的步骤了,且看。
2.
printf("%x \t %x \n",(c+i),*(c+i));
这里(c+i)输出的是地址。*(c+i)输出的是该地址所存储的数。
我们可以看到他们两个都有+号,而这里的+后代表的是,地址加后变为下一个该类型数据所存放的地址,而不是只把字节或者说地址+1。
这是因为对int来说,如果原来的地址是abc123,那么+1后则变为abc127。(原本的一个int型数据就要占4个字节即abc123,abc124,abc125,abc126)。
现在知道为什么1中要强制转换为char型了吧?因为一个char型数据占一个字节,若要依次输出每个字节的内容,当然+1后要让地址仅仅+1。如果原来的地址是abc123,对char来说,+1就真的是变成abc124。