理解指针的问题教程

Problems understanding tutorial on pointers

本文关键字:问题 教程 指针      更新时间:2023-10-16

此代码摘自cplusplus.com。它在教程中用于解释指针,我正在努力理解。

当他们写p1 = 20;在代码结束时,这不会改变第一个值和第二个值的内存地址吗?因为他们已经在之前的代码中让p1 = p2。

如果有人有不同的方式来解释它除了他们的评论从网站或其他教程?

谢谢!

#include <iostream>
using namespace std;
int main ()
{
  int firstvalue = 5, secondvalue = 15;
  int * p1, * p2;
  p1 = &firstvalue;  // p1 = address of firstvalue
  p2 = &secondvalue; // p2 = address of secondvalue
  *p1 = 10;          // value pointed to by p1 = 10
  *p2 = *p1;         // value pointed to by p2 = value pointed to by p1
  p1 = p2;           // p1 = p2 (value of pointer is copied)
  *p1 = 20;          // value pointed to by p1 = 20
  cout << "firstvalue is " << firstvalue << 'n';
  cout << "secondvalue is " << secondvalue << 'n';
}

摘自"http://www.cplusplus.com/doc/tutorial/pointers/"

图表可能更容易解释这一点。

  int firstvalue = 5, secondvalue = 15;

这意味着在内存的某处,创建了两个int对象:

+------------+    +-------------+
|     5      |    |      15     | 
+------------+    +-------------+
  int * p1, * p2;
  p1 = &firstvalue;  // p1 = address of firstvalue
  p2 = &secondvalue; // p2 = address of secondvalue

这意味着创建两个指针对象。它们的值指向两个int对象:

+------------+    +-------------+
|     5      |    |      15     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
*p1 = 10;          // value pointed to by p1 = 10

表示p1所指向的对象,即第一个int对象被修改:

+------------+    +-------------+
|     10     |    |      15     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
*p2 = *p1;         // value pointed to by p2 = value pointed to by p1

p2所指向的int对象与p1所指向的对象设置为相同的值:

+------------+    +-------------+
|     10     |    |      10     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
p1 = p2;           // p1 = p2 (value of pointer is copied)

在这行之后,不再指向第一个int对象。p1指向与p2相同的对象:

+------------+      +-------------+
|     10     |  +-> |      10     | 
+------------+  |   +-------------+
                |          ^
                |          |
    +----+      |       +----+
    | p1 |------+       | p2 |
    +----+              +----+
*p1 = 20;          // value pointed to by p1 = 20

p1所指向的对象(恰好是p2所指向的对象)被设置为20:

+------------+      +-------------+
|     10     |  +-> |      20     | 
+------------+  |   +-------------+
                |          ^
                |          |
    +----+      |       +----+
    | p1 |------+       | p2 |
    +----+              +----+

开始。第一个int是10,第二个是20。

当他们写p1 = 20;在代码结束时,这不会改变第一个值和第二个值的内存地址吗?因为他们已经在之前的代码中让p1 = p2。

他们实际上写的是*p1 = 20,但这就是为什么你是对的,是的。

如果你因为程序仍然发出两个不同的值而感到困惑,那是因为你打印的是firstvaluesecondvalue(它们仍然不同),而不是*p1*p2(到那时它们都是secondvalue)。

你没有解释为什么这让你困惑,或者你的问题是什么,或者这到底和priority_queue有什么关系,所以我只能告诉你这些。

我已经给出了一些意见,希望你能理解

#include <iostream>
using namespace std;
int main ()
{
  int firstvalue = 5, secondvalue = 15;
  int * p1, * p2;
  p1 = &firstvalue;  // *p1 = 5, since p1 is pointing to firstvalue
  p2 = &secondvalue; // *p2 = 15, since p2 is pointing to secondvalue
  *p1 = 10;          // *p1=10, changing firstvalue to 10
  *p2 = *p1;         // now *p2=10;
  p1 = p2;           // p1 is now pointing to secondvalue whose value is already changed into 10 by *p2=*p1; statement.
  *p1 = 20;          // now secondvalue=20 since p1 is pointing to second value
  cout << "firstvalue is " << firstvalue << 'n'; //prints 10
  cout << "secondvalue is " << secondvalue << 'n'; //prints 20
}