为什么数组下标是从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的数组本质上是什么呢,它又是如何实现的?