c++ - 取消引用预先增加的指针会产生奇怪的结果

标签 c++ pointers dereference pre-increment

这一定是个愚蠢的问题,但我无法理解为什么会这样

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

}

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

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

最佳答案

Why is the value of the pointer getting changed to 10(0xa) instead of incrementing the earlier address and assign 10 to that location?

到什么地方? 没有这样的位置p 指向一个 int,而不是 int 数组。此类增量产生的指针不指向您可以执行间接寻址的位置。像这段代码那样尝试这样做具有未定义的行为,这意味着绝对有可能发生任何事情。编译器可以自由地做任何它想做的事,因为对需要发生的事情没有任何要求。不要这样做。

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

关于c++ - 取消引用预先增加的指针会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926711/

相关文章:

c++ - 从 C++ 连接到 QML 图表

c++ - 在 C++ 中乘以和显示数组的值

C:如何将指针(数组元素)转换为int?

C++ 错误 C2819 : type 'List' does not have an overloaded member 'operator ->'

clojure - 我可以避免在 Clojure 解析中进行第二次符号查找吗?

c++ - vb.net 和 c++ 之间的文字 0.57 值精度较低

c++ - C++ 中的迭代 BST 插入

C 结构指针迭代

c++ - 无法访问在标准回调中传递的对象变量

rust - Rust 中的符号 '&' 和星号 '*' 是什么意思?