理解指针教程的问题

17D*_*OWN -3 c++ pointers

此代码取自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';
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ckl 5

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

  int firstvalue = 5, secondvalue = 15;
Run Code Online (Sandbox Code Playgroud)

这意味着在内存中的某个int位置创建了两个对象:

+------------+    +-------------+
|     5      |    |      15     | 
+------------+    +-------------+
Run Code Online (Sandbox Code Playgroud)
  int * p1, * p2;

  p1 = &firstvalue;  // p1 = address of firstvalue
  p2 = &secondvalue; // p2 = address of secondvalue
Run Code Online (Sandbox Code Playgroud)

这意味着创建了两个指针对象.它们的价值使得它们指向两个int对象:

+------------+    +-------------+
|     5      |    |      15     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
Run Code Online (Sandbox Code Playgroud)
*p1 = 10;          // value pointed to by p1 = 10
Run Code Online (Sandbox Code Playgroud)

这意味着修改了指向的对象p1,即第一个int对象:

+------------+    +-------------+
|     10     |    |      15     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
Run Code Online (Sandbox Code Playgroud)
*p2 = *p1;         // value pointed to by p2 = value pointed to by p1
Run Code Online (Sandbox Code Playgroud)

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

+------------+    +-------------+
|     10     |    |      10     | 
+------------+    +-------------+
       ^                 ^
       |                 |
    +----+            +----+
    | p1 |            | p2 |
    +----+            +----+
Run Code Online (Sandbox Code Playgroud)
p1 = p2;           // p1 = p2 (value of pointer is copied)
Run Code Online (Sandbox Code Playgroud)

在这一行之后,没有任何东西指向第一个int对象了.p1指向同一个对象p2:

+------------+      +-------------+
|     10     |  +-> |      10     | 
+------------+  |   +-------------+
                |          ^
                |          |
    +----+      |       +----+
    | p1 |------+       | p2 |
    +----+              +----+
Run Code Online (Sandbox Code Playgroud)
*p1 = 20;          // value pointed to by p1 = 20
Run Code Online (Sandbox Code Playgroud)

指向的对象p1(恰好与其指向的对象p2)设置为20:

+------------+      +-------------+
|     10     |  +-> |      20     | 
+------------+  |   +-------------+
                |          ^
                |          |
    +----+      |       +----+
    | p1 |------+       | p2 |
    +----+              +----+
Run Code Online (Sandbox Code Playgroud)

开始了.第一个int是10,第二个是20.