
一起动脑筋 · 先看一个小故事
女孩在图上画了一个标着 score 的格子。机器人问:格子的名字和地址,是同一回事吗?
把过程摊开来看
- 代码名字score
- 存储位置保存数据的地方
- 当前内容数值 8
程序通过变量名表达要使用的数据。内存模型中,可以把地址理解为寻找存储位置的编号。
名字方便写程序,地址帮助描述存放位置,值是那个位置保存的内容。
01程序运行时,变量为什么和内存有关?
CPU 在运行程序时,需要快速读取和修改数据。很多变量的数据因此会在内存中存在。
程序需要一个变量→运行环境安排存储→CPU 读取或修改
所以我们常说“变量在内存里”,这是入门阶段很有用的理解。
02内存是不是很多小格子?
可以把内存先想成一长排带编号的位置。每个 Byte 都可以通过地址找到。
地址 10001001100210031004
真实计算机中的内存管理当然更复杂,但“每个字节位置可以用地址标识”这个概念是正确的。
03一个变量会占几个 Byte?
取决于变量类型和具体平台。
int age = 10;
char grade = 'A';
bool ok = true;
这些类型占用的字节数并不一定相同。可以用 sizeof 查看某种类型或对象占多少 Byte。
std::cout << sizeof(int);
04变量有自己的地址吗?
很多实际存在于内存中的对象都有地址。C++ 可以用取地址运算符 & 得到对象地址:
int score = 95;
std::cout << &score;
地址像“位置编号”,帮助程序找到对象。
05变量一定真的占 RAM 吗?
不一定。这是一个很重要的纠正。
编译器可能把某些值放在 CPU 寄存器里,或者通过优化直接算出结果,让某个变量根本不需要单独的内存位置。
06局部变量都在“栈”里吗?
很多实现中,函数局部变量常常会使用栈空间,但这也不是 C++ 语言标准要求的绝对规则。
如果编译器把变量优化到寄存器里,甚至完全消除,它就不一定真的占用栈上的位置。
你已经知道了什么
- 程序运行时,很多变量的数据会存在内存中。
- 内存中的 Byte 可以用地址定位。
- 变量占用多少空间由类型和平台决定。
sizeof可以查看对象或类型的大小。- 变量不一定总对应 RAM 中一个固定小格子,编译器可能使用寄存器或优化掉它。
- “局部变量一定在栈上”并不是严格的语言规则。
下一篇:int:怎样保存整数?
轮到你来试一试
把 score 从 8 改成 9,变量名一定也要改吗?
想好了吗?点开看解释
不用。名字仍可叫 score,改变的是当前值。这就像给同一张记分卡擦掉旧分数再写新分数。