女孩和机器人一起思考

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

机器人沿着一排相同大小的抽屉找数字。若第一格位置已知,它需要翻遍所有抽屉吗?

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 首元素起始位置
  2. 下标 1跨过 1 个元素
  3. 下标 2跨过 2 个元素

普通 C++ 数组的元素在内存中连续排列。

每个元素同类型、大小相同,因此可以由起始位置加上下标乘元素大小,确定对应位置。这里跨过的是元素数,不一定是字节数。

01数组为什么适合一排排画出来?

int a[4] = {10, 20, 30, 40};

普通 C++ 数组的元素在内存中连续排列

a[0]10a[1]20a[2]30a[3]40

02“连续”到底是什么意思?

如果每个元素占用 4 Byte,那么相邻元素起始地址通常会相差 4 Byte:

1000100410081012

这里只是举例,真实地址每次运行可能不同,而且 int 也不被标准保证一定是 4 Byte。

03为什么数组元素能很快找到?

因为元素大小一致、位置连续。知道第一个元素地址和下标,就能计算某个元素的位置。

概念上可以理解为:

第 i 个元素地址 ≈ 首地址 + i × 元素大小

这也是“下标为什么从 0 开始”背后的重要原因。

04数组名就是指针吗?

不能直接说“数组就是指针”。

数组是一种真正的对象类型,包含固定数量的元素。

不过在很多表达式中,数组名会发生数组到指针转换,变成指向第一个元素的指针。

05连续存储有什么好处?

下标定位

可以快速计算元素位置。

遍历方便

一个接一个访问非常自然。

缓存友好

现代 CPU 常能高效利用相邻数据。

06数组的总大小怎样计算?

int a[10];

数组对象占用的总空间等于:

元素个数 × 每个元素的大小

在代码里可以写:

sizeof(a)

它得到整个数组对象占用的 Byte 数。

你已经知道了什么

  • 普通 C++ 数组元素在内存中连续排列。
  • 相邻元素地址差等于元素大小。
  • 连续存储让下标定位和遍历非常高效。
  • 数组不是指针,但在很多表达式中会转换成指向首元素的指针。
  • sizeof(array) 可以得到整个数组对象的大小。

下一篇:为什么数组下标从 0 开始?

轮到你来试一试

若示例中每个元素占 4 字节,下标 2 距起点多少字节?

想好了吗?点开看解释

8 字节,因为跨过 2 个元素,每个 4 字节。这里的 4 是题目给定的条件。