提到数组 [0] 以首先获取arrarys
. 为什么我们不使用 arrary[1] 来获取第一个值。如果我们使用 arrary[1] 对程序员来说很容易,但为什么我们使用 array[0]
2 回答
使用 0 作为第一个数组索引的约定可以追溯到 C。在 C 中,数组作为一个概念与底层内存模型非常紧密地耦合——数组实际上是内存中的一系列值,从分配的地址开始在。为了从这个数组中获取一个地址,你可以把它的值作为一个指针,增加一个指针值,然后看看那个地方的内存中有什么。在取消引用之前向这个“指针”添加 0 会给你数组中的第一项 - 所以首先使用 0 是很自然的,否则每次你分配一个数组时,你要么 1) 必须在每次访问之前减 1 或2)每次分配都浪费了整个项目空间。它还有第三个优点——如果你的数组中有 256 个条目,你可以用一个字节(它只包含 0 到 255)来索引它,但是如果数组从 1 开始,
Java 和 C# 以及 Javascript 等继承语法的语言以及因此的 C 思维模型也出于相同的原因使用 0 索引数组 - 一致性是一个强大的东西。
相比之下,某些语言(例如 Lua)的目标是“直观易懂”并且从 1 开始。
用什么编程语言?有些编程语言的数组从 1 开始索引。有些编程语言的数组从 0 开始索引。有些编程语言的数组从任何用户定义的值开始索引。
在较低级别的语言中,您可能会看到0
在起始索引处使用,因为在硬件级别,数组的第一个元素位于0
内存中整个数组开头的字节偏移处。这允许一个非常简单和有效的公式来计算各种数组元素的字节偏移量。例如,对于数组的第 i 个元素,字节偏移量为i * element_size
。这种简单的计算(例如乘以编译时间常数)可以通过给定硬件上的单个机器指令来实现,这使得数组访问特别有效。