这个程序输出结果是啥呀,给我整晕了

img


第一个输出应该是b
第二个应该是12345678吧
后面的就真的看不出来了,a后一个数我咋知道是啥。


#include <stdio.h>

int main (int argc, const char *argv[])
{
    // insert code here..
    unsigned int a,b;
    a = 0x12345678;
    b=-1;
    if (a>b) printf("a\n");
    else printf("b\n");
    printf("a=%x\n",*(&a)); // a取地址然后指针指向该地址的值,也就是还是a的值16进制输出
    printf("a=%x\n",*(&a + 1)); // a取地址,地址+1,然后指针指向该地址的值,该地址对应的值未定义,输出随机
    printf("&a=%p\n", &a);
    printf("char *(&a)=%p\n", (char *)(&a));
    printf("a=%x\n",*((char*) (&a))); // a取地址,然后将int型指针(指向四个字节)转换成char型指针指向一个字节,取该指针对应的地址
    printf("char * (&a)+1=%p", (char*)(&a)+1);
    printf("a=%x\n",*((char*)(&a)+1));
    return 0;
}

输出:

b
a=12345678
a=ffffffff
&a=000000000061FE18
a=78
char *(&a)=000000000061FE18
a=56
char * (&a)+1=000000000061FE19

定义一个int型的变量,申请四个字节的空间,其实是一个字节表示一部分,比如第一个字节的地址空间表示0x78,第二个字节表示0x56。而char * (&a)的作用就是将int型指针(指向四个字节)转换成char型指针指向一个字节,故*((char *)(&a))取第一个字节的地址空间的值78。如果组合起来看不懂的话,可以按照表达式执行的步骤拆分执行去理解。

回答不易,请及时采纳