我不懂C++指针算法

And*_*dre 2 c c++ pointers integer pointer-arithmetic

我有以下程序,它定义了2个整数和一个指向整数的指针.

#include <stdio.h>

int main() {

    int bla=999;
    int a=42;
    int* pa=&a;

    printf("%d \n", *pa);
    printf("%d \n", pa);

    pa++;
    //*pa=666; //runs (no error), but the console is showing nothing at all

    printf("%d \n", *pa);
    printf("%d \n", pa);

    pa++;
    //*pa=666; //runs and changes the value of *pa to 666;

    printf("%d \n", *pa);
    printf("%d \n", pa);

}
Run Code Online (Sandbox Code Playgroud)

输出是:

42

2686740

2686744

2686744 //这个值很奇怪,我想

999

2686748

地址对我来说很有意义,但第四个值很奇怪,因为它正是int的地址.有人可以解释一下这种行为吗?

当我评论*pa = 666(第一个外观)时,控制台什么也没显示,所以这里有一些错误,但编译器没有显示错误.也许这是因为我的系统上的int的大小,我有一个64位的Windows-os,所以也许int是64位而不是32?并且因为第二次增量后*pa值是999而不是第一次?

我相信,有很多C程序员可以解释发生了什么:)

Gop*_*opi 5

int* pa=&a;
Run Code Online (Sandbox Code Playgroud)

pa是指向整数的指针,并*pa定义了访问权限.

一旦递增指针,指针指向某个内存(在p之后),这个内存未由您分配或您不知道,因此取消引用它会导致未定义的行为.

pa++;
Run Code Online (Sandbox Code Playgroud)

*pa 是UB

编辑:

使用正确的格式说明符打印%p@haccks指出的指针值