1

为什么很多编程语言中数组都从0开始编号

 1 year ago
source link: https://hbuacm.github.io/2022/07/06/%E6%AF%8F%E6%97%A5%E5%88%86%E4%BA%AB2022day03%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BE%88%E5%A4%9A%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%95%B0%E7%BB%84%E9%83%BD%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%BC%96%E5%8F%B7/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

HBUACM

为什么很多编程语言中数组都从0开始编号
发表于 2022-07-06| 更新于 2022-07-06|2022程序设计训练营每日分享
阅读量:1

为什么很多编程语言中数组都从0开始编号

从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。

如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址。

a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址就是

a[k]_address = base_address + k * type_size

我们拿一个长度为 10 的int 类型的数组int[] a = new int[10]来举例。

计算机给数组 a[10],分配了一块连续内存空间 1000~1039,其中,内存块的首地址为 base_address = 1000

计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。

当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size //data_type_size 表示数组中每个元素的大小。
但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为

a[k]_address = base_address + (k-1)*type_size

从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。

所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

C 语言设计者用 0 开始计数数组下标,之后的 JavaJavaScript 等高级语言都效仿了 C 语言,或者说,为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。但也有一些语言中,数组也并不是从 0 开始计数的,比如 Matlab。甚至还有一些语言支持负数下标,比如 Python。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK