这一定是一个愚蠢的问题,但我无法理解为什么会发生这种情况
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 分配给该位置?
这一定是一个愚蠢的问题,但我无法理解为什么会发生这种情况
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 分配给该位置?
为什么指针的值被更改为 10(0xa) 而不是增加较早的地址并将 10 分配给该位置?
到什么位置?没有这样的位置。p
指向一个 int
,而不是 s 的数组int
。这种增量产生的指针并不指向您可以执行间接操作的位置。像这段代码那样尝试这样做有未定义的行为,这意味着绝对有可能发生任何事情。编译器可以随心所欲地做任何事情,因为对需要发生的事情没有任何要求。不要这样做。
在您的特定实验中,这两个变量似乎彼此相邻,并且当递增时,变量p
最终指向自身,然后分配了 10,即十六进制的 A。当您使用不同的编译器版本或编译器选项进行编译时,或者即使您对代码进行看似无害的更改,也无法保证这种情况会再次发生。不要这样做。
您正试图通过递增指针来访问可能已被占用或正在被另一个程序/进程使用的位置,并且您正试图覆盖该值。
通过将指针增加一个元素,实际上您正在访问同一个指针并将其值修改为 0xA,因为它们按顺序位于内存中。