将变量赋值给指针后,变量原内存地址会发生什么变化?
关于C++指针与变量内存的疑问解答
先看你给出的代码和思考:
using namespace std; #include <iostream> int main() { int ref; // 一个位于未知内存地址的变量(我们称该地址为X) int *point; // 一个指针变量(我们称其内存地址为Y) ref = 3; // 将int型数值3存储在地址X处 point = &ref; // 指针point现在存储了变量ref的地址X // 地址X发生了什么?现在存在已知和未知两个地址吗? cout << point << endl; // 输出指针point的地址Y cout << *point << endl; // 输出指针point指向的内容(3) cout << ref << endl; // 从何处输出3? return 0; }
针对你的疑问逐一解答:
1. 将变量赋值给指针后,变量原本的内存地址X会发生什么变化?
完全没有变化。point = &ref; 这个操作只是把变量ref的地址X复制到指针变量point里,本质是给point这个变量赋值,和ref本身的地址、存储的数值都没有任何关系。ref依然在地址X处,存储的数值还是3,没有被修改或移动。
2. cout输出ref的数值3是来自哪里?
直接来自ref所在的内存地址X。当你写cout << ref << endl;时,编译器会直接定位到ref的内存地址X,读取里面存储的int值3,然后输出。
3. 是否存在已知和未知两个地址的情况?
不存在。这里的两个地址X和Y都是确定的:
- X是变量
ref的内存地址,只是你一开始不知道它具体是多少,但程序运行时操作系统会给它分配一个明确的地址; - Y是指针变量
point的内存地址,同样是程序运行时操作系统分配的明确地址。
你觉得“未知”只是因为你没有主动去输出或查看它们,但它们从变量被创建时就已经被分配了确定的内存地址。另外,cout << point << endl;输出的不是Y(point自己的地址),而是point里面存储的X(ref的地址)——这是你代码注释里的一个小误区。如果你想输出point自己的地址Y,应该写cout << &point << endl;。
内容的提问来源于stack exchange,提问作者Code N00b
相关产品推荐
相关产品推荐

