← 返回题目列表

数组为什么常用 0 作为起始下标?0 基下标有什么好处和坑?

中等 第 27 / 30 题 更新于 2026/07/30
数组下标边界

简化版

0 基下标让第 i 个元素地址可以直接写成 base + i * size,也让半开区间 [l, r) 的长度等于 r - l。它的坑主要是人类习惯从 1 数数,容易写出 off-by-one 错误。

详细版

很多语言采用 0 基下标,是因为它和内存偏移天然一致。

  • 下标本质可以理解为距离数组起点的偏移量。
  • 第 0 个元素偏移 0,第 1 个元素偏移 1 个元素大小。
  • 半开区间 [l, r) 和 0 基下标配合很好,长度为 r - l
  • 第 k 个和下标 k 容易混淆:第 1 个元素下标是 0。
  • 一些数学题或业务编号从 1 开始,需要做映射。

完整版教学

一、下标为什么可以理解成偏移量

数组在内存中连续存储,访问元素时需要知道从起始地址偏移多少。0 基下标最自然:arr[0] 就是起始位置,不需要偏移;arr[1] 偏移一个元素大小;arr[i] 偏移 i 个元素大小。如果从 1 开始,地址公式就要写成 base + (i - 1) * size。这就是 0 基下标最底层的直觉。

address(arr[i]) = base + i × elementSize

记忆钩子:0 基下标里的 i 不是“第几个”,而是“离起点偏了几个元素”。

二、0 基下标和半开区间很搭

程序里常用半开区间 [l, r),表示包含 l,不包含 r。它的长度正好是 r - l,空区间是 [x, x),拼接区间也很自然:[0, mid)[mid, n) 正好覆盖 [0, n)。这些性质让循环边界更统一。很多数组算法喜欢写 for (let i = 0; i < n; i++),本质就是遍历 [0, n)

for (let i = 0; i < arr.length; i++) {
  // i 属于 [0, arr.length)
}

三、带数字看 1 基和 0 基映射

如果用户说“第 3 个元素”,在 0 基数组里下标是 2。长度为 5 的数组合法下标是 0 到 4,而不是 1 到 5。很多 off-by-one 错误都来自把自然语言的序号和程序下标混为一谈。解决方法是明确变量语义:index 表示下标,rankkth 表示第几个。

自然语言0 基下标
第 1 个0
第 2 个1
第 3 个2
第 n 个n - 1

四、为什么长度为 n 的数组下标到 n-1

如果下标表示偏移,长度为 n 表示有 n 个位置,偏移分别是 0、1、2、一直到 n-1。偏移 n 表示跳过了 n 个元素,已经到数组末尾之后的位置,也就是半开区间的右边界。理解这一点后,i < ni <= n - 1 更贴近区间语义,也更不容易在空数组时出错。

长度 5:
合法偏移: 0 1 2 3 4
偏移 5: 末尾后一个位置,不是元素

五、哪些场景会切换到 1 基

虽然很多语言数组是 0 基,但有些算法会人为使用 1 基数组,例如树状数组、堆的教材推导、动态规划为了简化边界多开一行一列。此时数组下标 0 可能不用,或者作为哨兵。这样做不是否定 0 基,而是为了让公式更简单。面试时要能解释清楚为什么某个结构选择 1 基。

树状数组常用 1 基:
lowbit(i) = i & -i
i = 0 时无法继续向前推进,所以下标从 1 开始更自然

六、工程里怎么避免下标混乱

最重要的是给变量取对名字。iindex 表示 0 基下标,count 表示数量,k 表示第 k 个时要明确是否从 1 开始。区间尽量统一使用 [l, r)[l, r],不要混着写。循环前可以用小例子验证边界,比如 n=0、n=1、n=2。数组 bug 很多不是算法不会,而是语义没统一。

自检样例:
n = 0:循环不进入
n = 1:只访问 index 0
n = 2:访问 index 0 和 1

七、常见误区与追问

  • 误区:0 基下标只是语言习惯。 它和内存偏移、地址计算、半开区间都有关系。
  • 误区:长度 n 的最后一个下标是 n。 最后一个合法下标是 n - 1,n 是末尾后位置。
  • 误区:第 k 个元素下标就是 k。 0 基数组里第 k 个元素下标是 k - 1。
  • 追问:为什么 [l,r) 长度是 r-l 因为它包含从 l 到 r 前一个位置的偏移数量。
  • 追问:为什么有些结构用 1 基? 为了简化公式或保留 0 作为哨兵,例如树状数组。

八、加强记忆

0 基下标可以记成“偏移量下标”。下标 0 表示离起点 0 个元素,长度 n 表示合法偏移有 n 个,从 0 到 n-1。面试时把地址公式、半开区间和 off-by-one 风险连起来讲,就能从底层到实践都说清楚。