这是最开始问题
int x=3,y;
int *p=&x;
printf("1. x :%d &x:%p\n",x,&x);
printf("1. *(&x+1):%d *(&x+1):%p\n",*(&x+1),(&x+1));
y=*p++;
printf("**********************\n");
printf("2. x :%d &x:%p\n",x,&x);
printf("2. *(&x+1):%d *(&x+1):%p\n",*(&x+1),(&x+1));
printf("x=%d,y=%d\n",*p,y);
运行的结果如下:
1. x :3 &x:0x7ff0899dd0
1. *(&x+1):127 *(&x+1):0x7ff0899dd4
**********************
2. x :3 &x:0x7ff0899dd0
2. *(&x+1):3 *(&x+1):0x7ff0899dd4
x=3,y=3
然后这是原题
int x=3,y;
int *p=&x;
y=*p++;
printf("x=%d,y=%d",*p,y);
为什么*p=3啊,他不是自增了吗?
刚刚有几个老哥说p指向y了,然后我就去试了
printf("%p,%p,%p",&x,p,&y);
结果
0x7fdb8091a4,0x7fdb8091a8,0x7fdb8091a0
而且输出&y,上面的x会变成乱码……我裂开了😵
?
这不好解释,首先你连续定义两个局部变量x,y . 根据栈的生长方向, x 的地址应该比y的地址大4个字节
第1个printf就不必多说了
第2个printf,(&x+1)就是x的地址值加上1个 int的大小,就是+4;&x+1这个地址存放的数据可能是个随机值,这个看编译器吧
第3,4个printf也不必说吧
第5个printf,先看y = p++,这句代码是先将p赋值给y,再p++的,此时y = 3,p 不指向x了