很神奇 真的百思不得其解

int a = 5;
int b = 11;
int* p =&a;

/*printf("&b=%p\n",&b);*/
printf("*p=%d\n",*(p));
printf("*(--p)=%d\n",*(--p));


这玩意儿真的很神奇。。。不知道发生了什么。。。
把上面的注释打开,第二个print的结果不一致。。。
在Win10下的codeblocks(32位mingw编译器)下,我的结果是:
当注释符存在的时候,输出为:
*p=5
*(--p)=4200672
当注释符打开的时候,输出为:
&b=0060FEF4
*p=5
*(--p)=11
明明就只是多一个printf,为什么*(--p)的结果就不同呢??。。。

阅读 1.5k
1 个回答

*(--p)在这里对指针的移动没有意义,因为我们无法不知道--p指向谁,你之前的测试只是恰好指向了b的内容,但我在Ubuntu18.04下测试的则不是b的值,只是内存中的一个数字而已,如下图:

root@lui-pc:~/CLionProjects/test01# ./main
&b=0x7ffd9adc381c
*p=5
*(--p)=22043
root@lui-pc:~/CLionProjects/test01# 
root@lui-pc:~/CLionProjects/test01# cat main.c
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int a = 5;
    int b = 11;
    int* p =&a;

    printf("&b=%p\n",&b);
    printf("*p=%d\n",*(p));
    printf("*(--p)=%d\n",*(--p));
}root@lui-pc:~/CLionProjects/test01# 
root@lui-pc:~/CLionProjects/test01# 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题