此代码取自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)
图表可能更容易解释这一点.
Run Code Online (Sandbox Code Playgroud)int firstvalue = 5, secondvalue = 15;
这意味着在内存中的某个int位置创建了两个对象:
+------------+ +-------------+
| 5 | | 15 |
+------------+ +-------------+
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)int * p1, * p2; p1 = &firstvalue; // p1 = address of firstvalue p2 = &secondvalue; // p2 = address of secondvalue
这意味着创建了两个指针对象.它们的价值使得它们指向两个int对象:
+------------+ +-------------+
| 5 | | 15 |
+------------+ +-------------+
^ ^
| |
+----+ +----+
| p1 | | p2 |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)*p1 = 10; // value pointed to by p1 = 10
这意味着修改了指向的对象p1,即第一个int对象:
+------------+ +-------------+
| 10 | | 15 |
+------------+ +-------------+
^ ^
| |
+----+ +----+
| p1 | | p2 |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)*p2 = *p1; // value pointed to by p2 = value pointed to by p1
int指向的对象p2应设置为与指向的对象相同的值p1:
+------------+ +-------------+
| 10 | | 10 |
+------------+ +-------------+
^ ^
| |
+----+ +----+
| p1 | | p2 |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)p1 = p2; // p1 = p2 (value of pointer is copied)
在这一行之后,没有任何东西指向第一个int对象了.p1指向同一个对象p2:
+------------+ +-------------+
| 10 | +-> | 10 |
+------------+ | +-------------+
| ^
| |
+----+ | +----+
| p1 |------+ | p2 |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)*p1 = 20; // value pointed to by p1 = 20
指向的对象p1(恰好与其指向的对象p2)设置为20:
+------------+ +-------------+
| 10 | +-> | 20 |
+------------+ | +-------------+
| ^
| |
+----+ | +----+
| p1 |------+ | p2 |
+----+ +----+
Run Code Online (Sandbox Code Playgroud)
开始了.第一个int是10,第二个是20.