
一起动脑筋 · 先看一个小故事
机器人沿着一排相同大小的抽屉找数字。若第一格位置已知,它需要翻遍所有抽屉吗?
把过程摊开来看
- 首元素起始位置
- 下标 1跨过 1 个元素
- 下标 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 是题目给定的条件。