数组是计算机编程语言中一种基础的数据结构。创建数组会申请一整块固定大小的计算机内存。内存空间的连续性给数组带来了常量级访问数组元素的时间复杂度。当我们知道了数组的第一个元素的地址,就可以通过简单的地址偏移的加减运算,取出任意位置的元素的地址和值,这就是所谓的“随机访问”。

而在编程语言的使用中,我们不需要关心具体内存地址,通过“数组下标”就可以访问到对应位置的元素。而计算机会经过下面的计算:

数组特定下标的元素值 = 取地址中的值(数组首地址 + 下标 * 单个元素所占内存长度)

  1. 取地址中的值: “根据地址取出其中存放的值”是计算机底层的一个基础操作,这里不多讨论。
  2. 数组首地址: 数组的首地址一般就是我们申请数组内存后赋值给的那个变量所代表的地址。
  3. 下标: 从这个公式就很容易理解为什么数组的下标是从0开始的。因为下标代表的是偏移单位。0表示没有地址偏移,即第一个元素。我们当然也可以设计出用下标1代表第一个元素的数组,但这样每次计算都会多出一个"下标-1"的操作,降低了计算效率。由于数组大小是固定是,因此下标超过 size-1 会访问到数组内存空间以外的地址,这通常是不允许的,会抛出“数组访问越界错误”。
  4. 单个元素所占内存长度: 以上公式成立的一个前提条件是:数组中的元素所占内存大小是相同的。因此,一般数组中的所有元素都要求是相同类型。这个类型也就是我们所说的数组类型。