女孩和机器人一起思考

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

女孩站在第一块地砖上,机器人问:“你离起点跨过了几块砖?”答案是 0,不是 1。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 第 1 个偏移 0
  2. 第 2 个偏移 1
  3. 第 3 个偏移 2

C++ 数组下标表示相对首元素的位置,第一项的偏移是 0。

“第三个”是在数数量,“下标 2”是在说从起点走几步。分开这两种问法,就容易理解。

01第一个元素为什么不是 a[1]?

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

第一个元素是 a[0],最后一个是 a[3]

02下标更像“偏移量”

可以把下标理解成:从第一个元素开始,向后偏移几个元素。

a[0]

偏移 0 个 → 还是第一个。

a[1]

偏移 1 个 → 第二个。

a[2]

偏移 2 个 → 第三个。

a[3]

偏移 3 个 → 第四个。

03它和地址有什么关系?

数组元素连续存储,因此概念上:

a[i] 的位置 = 第一个元素的位置 + i 个元素

所以第一个元素自然就是偏移 0 个位置。

04a[i] 和指针有什么关系?

在 C++ 中,对普通数组来说,表达式:

a[i]

和:

*(a + i)

在相应语境下表示同一个元素。

05长度为 n 的数组,合法下标是什么?

如果数组长度是 n,合法下标是:

0 到 n - 1

例如长度 5:

0, 1, 2, 3, 4

06为什么最容易写错最后一个位置?

因为人习惯“第 1 个、第 2 个……第 n 个”,而数组使用“偏移 0、1……n-1”。

你已经知道了什么

  • 数组第一个元素的下标是 0。
  • 下标可以理解成从首元素开始的偏移量。
  • 连续存储让“首地址 + 偏移”成为自然的定位方式。
  • 长度为 n 的数组,合法下标范围是 0 到 n-1。
  • 最后一个元素不是 a[n],而是 a[n-1]。

下一篇:怎样遍历一个数组?

轮到你来试一试

长度为 8 的数组,最后一个有效下标是多少?

想好了吗?点开看解释

7。有效下标满足 0 ≤ 下标 < 8,共八个,而不是最大下标也写 8。