为什么数组下标是从0开始的

问题

大多数编程语言中数组的下标都是从0开始,对于刚接触编程的人来说都有些不适应,那么为什么不是从大家习惯的1开始呢?

什么是数组

数组(Array)是一种线性表数据结构。它用一组连续的内存空间来存储一组具有相同类型的数据。

线性表

就是数据排成一条线一样的结构。

非线性表

如二叉树,堆,图等。
数据之间并不是简单的前后关系。

数组如何实现任意访问

数组是一片连续的内存空间,我们以长度为10的int类型数组为例。

  • 数组有一个基准地址base_address
  • 根据数据类型每个元素所占的字节数(data_type_size)也不一致

所以数组某个元素的地址为:
a[i]_address = base_address + i * data_type_size

下标为何从0开始

如果下标从1开始:
a[i]_address = base_address + (i - 1) * data_type_size
发现寻址的公式多了一个减法操作,那响应的CPU就多一个减法指令。从效率上来说就不如从0开始。

但是这样的分析是全部的事实么?我觉得也不是,像python,matlab等不仅有下标从1开始,甚至还有负数下标。

疑问

PHP数组可以动态扩容,类型还可以不一致,还能像map一样设置key-value,通过key来访问value,那么PHP的数组本质上是什么呢,它又是如何实现的?

加载评论框需要科学上网