1

这一定是一个愚蠢的问题,但我无法理解为什么会发生这种情况

int main()
{
    int i=20;
    int *p=&i;
    cout<<"old p="<<p<<endl;
    *(++p) = 10;
    cout<<"p="<<p<<endl;

}

在这段代码中,我得到的输出为: old p=0x22ff08 p=oxa

为什么指针的值被更改为 10(0xa) 而不是增加较早的地址并将 10 分配给该位置?

4

3 回答 3

4

为什么指针的值被更改为 10(0xa) 而不是增加较早的地址并将 10 分配给该位置?

到什么位置?没有这样的位置p指向一个 int,而不是 s 的数组int。这种增量产生的指针并不指向您可以执行间接操作的位置。像这段代码那样尝试这样做有未定义的行为,这意味着绝对有可能发生任何事情。编译器可以随心所欲地做任何事情,因为对需要发生的事情没有任何要求。不要这样做。

在您的特定实验中,这两个变量似乎彼此相邻,并且当递增时,变量p最终指向自身,然后分配了 10,即十六进制的 A。当您使用不同的编译器版本或编译器选项进行编译时,或者即使您对代码进行看似无害的更改,也无法保证这种情况会再次发生。不要这样做。

于 2012-10-17T03:38:38.733 回答
1

您正试图通过递增指针来访问可能已被占用或正在被另一个程序/进程使用的位置,并且您正试图覆盖该值。

于 2012-10-17T03:39:28.247 回答
1

通过将指针增加一个元素,实际上您正在访问同一个指针并将其值修改为 0xA,因为它们按顺序位于内存中。

于 2012-10-17T03:44:12.690 回答