数组下标为什么从 0 开始?没说到点儿上

218 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情


哈喽,大家好,欢迎来到程序员创造营,我是二营长。

昨天摸鱼的时候看到很多博主都在转一篇《数组下标为什么从0开始?》的文章,原文链接找不到了,贴一个别人转发的。

文章的大概内容首先说这个问题 Dijkstra 已经解答过了,Dijkstra 是谁呢?

不好意思我还真不知道,百度一下发现是迪克斯特拉算法的作者,该算法解决了有权图中最短路径问题,总之非常牛。

然后列出了一些不等式来说明大神的想法,并附上大神的手稿。

最后的结论的如下:

从下标 0 开始能够给出更好的不等式,因为元素的下标就等于序列中它前面的元素数(或者说 “偏移量”)

文章到这就结束了,看完说实话给我的感觉,似懂非懂,明白了但又不怎么明白,不够透彻。索性就看看评论区,评论区多次提到了寻址这个词,如此再一思考,不禁恍然大悟。

所以本文就的内容就是把「数组下标为什么从 0 开始」说清楚,说透彻。没有说原作者写的不对或者不好的意思,只是觉得没说到点儿上,还差临门一脚。

为什么从0开始

进入正题,为什么从 0 开始,其实很简单,一张图就搞定,如下:

首先数组的定义:一种线性数据结构,用连续的内存空间存储同一类型的数据,支持按下标的随机访问。

随机访问,即根据下标可以计算出该元素存放的内存地址,也就是说所有元素的存放都应该遵循一个寻址公式。

如上图,新建一个8个元素的数组,即有一块连续的内存空间来存放这8个元素,假设内存块的首地址base_address = 1000,则每个元素的地址如图所示。

如果数组下标从 0 开始,则寻址公式为a[i]_address = base_address + i * data_type_size,其实data_type_size为数组存放数组类型的大小,int 类型为 4 字节。

如果数组下标从 1 开始,每次寻址都会多一步减一操作。

综上所述,数组下标从 0 开始是为了随机访问时寻址更快,出于性能的考虑。

补充

除了性能原因,还有历史原因,C 语言设计数组时下标从 0 开始,之后的 Java,JavsScript 等高级语言都模仿了C 语言,或者说,为了在一定程度上减少C 语言程序员学习 Java 的成本,继续沿用了从 0 开始计数的习惯。

实际上,也有其它语言中数组下标并不是从 0 开始的,比如 Matlab,甚至还有一些语言支持负数下标,比如 Python。

总结

今天就聊到这,一个小问题,作为开发者都应该有所了解。