【问题标题】:logic of pointers指针逻辑
【发布时间】:2011-11-07 22:37:37
【问题描述】:

我大致了解了指针的逻辑,但对我来说有一个不清楚的点与底层代码有关。

#include <iostream>
using namespace std;

int main ()
{
int first = 50, 
second = 150;
int * p1, * p2;

p1 = &first;         //p1 is assigned to the address of first
p2 = &second;        //p2 is assigned to the address of second
*p1 = 100;           //first's value is changed as 100 by assigning p1's value to 100
*p2 = *p1;           //now p2's value should be 100 
p1 = p2;             //I think we want to change p1's adress as p2
*p1 = 200;           //I expect that the new value of p1 should be 200

cout << first << second;

return 0;
}

程序打印 first=100 和 second=200,但正如我上面评论的,我希望 p1 的值更改为 200。但它仍然保持为 100。这有什么意义?

【问题讨论】:

  • p1 = p2 你的赋值改变了指针的值,之后p1 指向与p2 相同的值,即&amp;second
  • 我不明白你对p1 = p2; 的要求。这将使p1 指向与p2 相同的位置,所以现在p1 和p2 将指向同一个变量second。

标签: c++ pointers pointer-address


【解决方案1】:

您似乎将指针值与指针指向的值混淆了。

*p1 = 200;           //I expect that the new value of p1 should be 200

p1是一个指针,所以它的值实际上是一个内存位置,first的位置。 (类似于 0xDEADBEAF)。在这行之后:

p1 = p2;

p1左指向second的内存位置,所以在做的时候

*p1 = 200;

它实际上将second 设置为200。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 这是一种很好的图形方式来表示正在发生的事情,但很难阅读。考虑将图片分成 4 个,每个阶段一个,并放大它们,特别是字体大小。
    【解决方案3】:

    p1 = p2 使p1 指针指向p2 指向的int。现在p1 指向second。因此,在该指令之后,对*p1 的所有修改都会影响*p2 的值,因此second 也是如此。

    【讨论】:

      【解决方案4】:

      您将值 100 分配给存储在 p1 中的地址位置,这很好。然后您将此值移动到 p2。但是接下来您再次分配 p1 = p2,这使得存储在 p2 中的地址被移动到 p1,从而导致了麻烦。注释此行,您的代码将按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多