-2

我正在运行简单的程序。

这是代码。

#include<stdio.h>
#include<conio.h>

int main(){
char c,*cc;
int i;
long l;
float f;

c='z';
i=15;
l=77777;
f=3.14;
cc=&c;

printf("c=%c cc=%u\n",*cc,cc);
cc=&i;
printf("i=%d cc=%u\n",*cc,cc);
cc=&l;
printf("l=%ld cc=%u\n",*cc,cc);
cc=&f;
printf("f=%f cc=%u\n",*cc,cc);

return (getch());
}

因此,据我所知,整数的大小仍然高于 char,因此当我将整数变量分配给 char 指针时,它必须仅指向整数变量的第一个字节,因为 cc 是 char 指针。所以当我运行输出时,只有第一行 printf 应该给出正确的输出,其他行必须打印一些地址或一些垃圾值。

但在我的情况下,第二行 printf 也给出了正确的值,即 15 我分配给整数变量,而我认为它必须给出垃圾值。请告诉我它是如何发生的?

这是我的输出。

c=z cc=2686791
i=15 cc=2686780
l=-47 cc=2686776
f=0.000000 cc=4199093
4

2 回答 2

5

当我将整数变量分配给 char 指针时,它必须只指向整数变量的第一个字节

那么为什么第二行打印 15 令人惊讶呢?数字 15 适合一个字节,即int. 如果您的机器是 little-endian(它可能而且显然是),那么 LSB 正是具有最低内存地址的字节。


并用于%p打印指针,%u用于无符号整数。阅读 的文档printf()

于 2013-09-23T04:52:23.100 回答
2

整数的字节布局15[0x0f][0x00][0x00][0x00],因此当您取消引用时,cc您将获得第一个字节的内容(恰好是 15)。

要查看差异,请尝试这种情况i=1000,您应该会看到-24(地址处的字节&i0xe8-24当解释为有符号字节时)

于 2013-09-23T04:56:30.867 回答