有没有老哥帮忙解释一下这个问题

这是最开始问题

    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了