📜  为什么数组索引从零开始?(1)

📅  最后修改于: 2023-12-03 15:21:37.261000             🧑  作者: Mango

为什么数组索引从零开始?

在编程中,数组是最常用的数据结构之一,它可以存储一组有序的数据。在许多编程语言中,数组的下标都是从0开始的。那么为什么数组索引从零开始呢?

起源

首先,我们需要理解计算机是如何处理内存的。计算机内存是按字节(byte)分配的,每个字节都有一个唯一的地址。 数组是将相同类型的数据存储在连续的内存空间中。数组的下标是用于访问这些内存位置的偏移量。

在最初的计算机系统中,内存是由一个地址线和一个数据线对组成的,早期计算机的地址线只有16位,每个地址均代表一个16位二进制数。如果内存大小为64K,那么最大的内存地址就是65535(2的16次方)。为了最大化内存使用,程序员需要利用每个地址,因此数组的第一个元素位于地址0。

好处

配合C/C++语言形成数组下标从0开始主要有以下几个好处:

习惯

C语言是最早采用数组下标从0开始的编程语言之一,随着其流行,程序员们逐渐养成了数组下标从0开始的习惯,因此在其他语言中使用该习惯会减少认知负担。

数组长度

数组的长度是通过其类型和分配的内存大小计算得出的,例如int类型的数组长度为sizeof(int)n,其中n为数组元素个数。倘若数组从1开始索引,那么数组长度就变为sizeof(int)(n+1),我们需要占用多余的内存空间。

数组越界

当数组下标从1开始时,访问数组元素就会产生[a+1]和a+1这样的混淆,而下标从0开始就避免了这个问题,绝不会出现这样模糊不清的语句。

计算方便

如果数组从0开始索引,那么计算数组偏移量就非常方便,只需要用偏移量乘以元素大小即可。例如数组a[100]中,a[0]的地址是&a,a[5]的地址是&a+5*sizeof(int)。

异同点

值得注意的是,并不是所有的编程语言都采用数组下标从0开始的方式,例如Fortran和Matlab等供科学计算的软件使用的方法是从1开始的。Python支持从任意位置的数组索引。

小结

虽然C语言和C++语言始终采用数组下标从0开始的方式,但是其他编程语言中采用从1开始的方式,这是基于不同的设计目标,这些语言可能认为从1开始更符合人们的数学思维方式。然而,基于习惯、数组长度、越界和计算方便这些原因,数组下标从0开始似乎更加优美。