首页 > 解决方案 > 为什么这里只有 p2 的值发生变化?

问题描述

所以我对指针的概念很陌生,我对以下示例代码有疑问。

#include <iostream>
using namespace std;

int main()
{
   int value1 = 5, value2 =15;
   int * p1, * p2;

   p1 = &value1;
   p2 = &value2;
   *p1 = 10;
   *p2 = *p1;

   cout << "value1 is " << value1 << "\n"; 
   cout << "value2 is " << value2 << "\n";

   p1 = p2;
   *p1 = 20;

   cout << "value1 is " << value1 << "\n"; 
   cout << "value2 is " << value2 << "\n";

   return 0;
}

输出:

value1 is 10
value2 is 10
value1 is 10
value2 is 20

我不明白为什么 value1 和 value2 都没有 20 作为它们的新值。

   p1 = &value1;
   p2 = &value2;
   *p1 = 10;
   *p2 = *p1;   

这里说得通。我相信我们已经将 p1 和 p2 分配给了 value1 和 value2 的地址,然后我们为 p1 分配了一个可以访问 value1 的地址的值,使得 value1 = 10,并且由于我们设置 p2 = p1,value2 也会发生同样的情况。因此,这两个值都将等于 10。然后在行中

p1 = p2;
*p1 = 20;

我们设置 p1 = p2; 然后给 *p1 一个值 20,但在终端中只输出 value2 的值为 20,应该分配给 p2。为什么在这之后 value1 不等于 20,为什么只有 value2 等于 20?

标签: c++pointers

解决方案


这是因为您只分配20value2

p1 = p2;  // from here both p1 and p2 will be pointing at value2
*p1 = 20; // value2 is assigned 20

value内存中存储变量的一些地址。

  addr0    addr1 
+--------+--------+
| value1 | value2 |
+--------+--------+

现在到你在做什么:

p1 = &value1; // p1 = addr0
p2 = &value2; // p2 = addr1

*p1 = 10;     // dereference p1 and assign 10 (value1 = 10)
*p2 = *p1;    // dereference p2 and assign the value from the dereferenced p1
              // (value2 = value1)

p1 = p2;      // assign p1 the address p2 is pointing at (p1 = addr1)
*p1 = 20;     // dereference p1 and assign 20 (value2 = 20)

推荐阅读