这个问题一定是个愚蠢的问题,但我无法理解为什么会发生这种情况
int main()
{
int i=20;
int *p=&i;
cout<<"old p="<<p<<endl;
*(++p) = 10;
cout<<"p="<<p<<endl;
}
在这段代码中我得到的输出为: 旧p = 0x22ff08 P =氧杂
为什么指针的值变为10(0xa)而不是递增先前的地址并将10分配给该位置?
答案 0 :(得分:4)
为什么指针的值变为10(0xa)而不是递增先前的地址并将10分配给该位置?
到什么地方? 没有这样的位置。 p
指向一个 int
,而不是int
的数组。由此增量产生的指针不指向可以执行间接寻址的位置。试图这样做的代码确实有未定义的行为,这意味着任何事情都可能发生。编译器可以随意做任何事情,因为对于需要发生的事情没有要求。不要这样做。
在您的特定实验中,出现两个变量彼此相邻,并且当递增时,变量p
最终指向自身,然后分配10,这是十六进制的A.当您使用不同的编译器版本或编译器选项进行编译时,或者即使您对代码进行看似无辜的更改时,也无法保证再次发生这种情况。不要这样做。
答案 1 :(得分:1)
您正在尝试通过递增指针来访问可能已被占用或正在被其他程序/进程使用的位置,并且您正试图覆盖该值。
答案 2 :(得分:1)
通过将指针递增一个元素,实际上您正在访问相同的指针并将其值修改为0xA,因为它们按顺序位于内存中。