我正在运行简单程序。
这是代码。
#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
答案 0 :(得分:5)
当我将整数变量赋给char指针时,它必须只指向整数变量的第一个字节
那为什么第二行打印15会令人惊讶?数字15适合一个字节,int
的最低有效字节。如果您的机器是小端(可能并且显然是),LSB正是具有最低内存地址的字节。
使用%p
打印指针,%u
用于无符号整数。阅读printf()
。
答案 1 :(得分:2)
整数15
的字节布局为[0x0f][0x00][0x00][0x00]
,因此当您取消引用cc
时,您将获得第一个字节的内容(恰好是15)。
要查看差异,请尝试案例i=1000
,您应该看到-24
(地址&i
处的字节为0xe8
,当-24
为{{1}}时解释为有符号字节)