为什么数组要从 0 开始编号,而不是从 1 开始呢?

数组,想必大家都不陌生,经常在编程的时候都会使用。但是你是否和我一样都存在一个疑惑:为什么数组要从0开始编号?正常人不都是1开始计数的吗?
《为什么数组要从 0 开始编号,而不是从 1 开始呢?》
笑话,咱们干这行的是正常人吗?
《为什么数组要从 0 开始编号,而不是从 1 开始呢?》
光我们new出的对象怎么说也得住个三宫六院了吧,嘿嘿嘿~

《为什么数组要从 0 开始编号,而不是从 1 开始呢?》
过了,咱们说回正题,为什么咱们程序员要独树一帜从0开始标记数组呢?下面开始正经讲解。

假如我们定义一个长度10的int类型数组a,那么毫无疑问计算机会数组a分配一段连续的空间,假设空间从1000开始至1039,那么首地址则 base_address就等于1000。如下面这张图所示:
《为什么数组要从 0 开始编号,而不是从 1 开始呢?》
那么当我们想要去访问数组中任意一个元素的时候,底层实怎么完成的呢?

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

 			a[i]_address = base_address + i * data_type_size

其中 data_type_size 表示数组中每个元素的大小。比如我们刚才定义的数组a,数组中存储的是 int 类型数据,所以 data_type_size 就为 4 个字节。这个公式非常简单,我就不多做解释了。

那么讲完了这个公式,我们就能很清晰的发现,其实数组的下标确切的说应该被称为偏移(offset)。前面也讲到,如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址,a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址只需要用这个公式:

			a[k]_address = base_address + k * type_size

但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为:

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

对比这两个公式,我们很容易就能发现,从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

因为最先开始使用0来开始标记数组的是C语言的设计者,而后面所诞生的语言多多少少都又受到C语言的影响,因此Java、JavaScript等语言延续了C语言的风格也从0开始标记。当然这并不包含所有,比如Matlab就不是从0开始来标记数组的,python数组的下标甚至可以是复数。

不多说了,我要去陪我的后宫佳丽了。

《为什么数组要从 0 开始编号,而不是从 1 开始呢?》

    原文作者:梅大志丶
    原文地址: https://blog.csdn.net/qq_44742154/article/details/105472777
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞