简单分析
在学习整数,浮点数以及中文字符的存储方式时,经常会需要直接查看他们在内存中的存储形式,如此一来,写一个函数来查看任意地址的存储内容就显得很有必要。
首先分析一下函数声明应该具有的形式:
void show(void* pnt,int size);
传入一个任意类型的指针以及需要查看的字节数,并直接把目标内存给printf出来。
第一步
从简单开始,先写一个可以用来查看某char类型数据内存的函数,叫做show_char()。
void show_char(char* p)
{
int cnt = 8*sizeof(char);
int* p_cnt = &cnt;
//之所以使用cnt以及指向cnt的指针p_cnt,
//是为了让_show()函数递归次数恰为8*sizeof(char)
_show(*p,p_cnt);
puts("");
}
//为show_char()的子函数
void _show(char x,int* p_cnt)
{
if (*p_cnt) {
(*p_cnt)--;
_show(x>>1,p_cnt);
printf("%d",x&1);
}
}
其中,利用了一个迭代函数_show()实现了正向输出,而非倒序输出。
第二步
然后,我们简要修改一下show_char()即可。
void show(void* pnt,int size)
{
char* p = (char*)pnt;
while (size--) {
int cnt = 8;
_show(*(p++),&cnt);
putchar(' ');
}
puts("");
}
void _show(char x,int* p_cnt)
{
if ((*p_cnt)--) {
_show(x>>1,p_cnt);
printf("%d",x&1);
}
}
完毕。
效果
int main()
{
char* s = "你好,world!";
show(s,12);
float f = -0.1;
show(&f,4);
int i = -1110651699;
show(&i,4);
}
可以看出,float f = -0.1以及int i = -1110651699在内存的存储是一样的,char* s = "你好,world!"的最后一位恰以'\0'作为字符串的结尾标识符。