女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩在图上画了一个标着 score 的格子。机器人问:格子的名字和地址,是同一回事吗?

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 代码名字score
  2. 存储位置保存数据的地方
  3. 当前内容数值 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,改变的是当前值。这就像给同一张记分卡擦掉旧分数再写新分数。