理解指针的问题教程
Problems understanding tutorial on 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';
}
摘自"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
,但这就是为什么你是对的,是的。
如果你因为程序仍然发出两个不同的值而感到困惑,那是因为你打印的是firstvalue
和secondvalue
(它们仍然不同),而不是*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
}
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- LLVM 万花筒教程 JIT 编译问题
- Arcsynthesis OpenGL 3.3 教程的问题 - MAKE 错误
- 编译 boost 文件系统的教程文件时遇到问题
- c++ /OpenGL教程(导入图像)后的问题
- SWIG教程问题
- CppCMS教程:静态链接模板错误(控制器问题)
- 理解指针的问题教程
- c++教程参考参数问题
- Boost Asio:关于教程的一些问题(同步日间服务器/客户端)
- Rastertek教程-问题与directx11 tut的第三部分