数组是一种线性表数据结构,线性表就是数据排成像一条线一样的数据结构,每个线性表上最多只有前和后两个方向,例如链表、队列、栈等等。
数组具有连续的内存空间和相同的数据类型,这两个限制使得数据具有“随机访问”的特性,即通过下标访问,但不好的地方是:为了保证数据的连续性,插入和删除数据需要做大规模的数据迁移工作,使得这些操作变得很低效,平均情况时间复杂度为O(n)。
数组的“下标”确切的说应该是“偏移(offset)”,a[0]就是内存偏移为0的位置的数据,也就是首地址,a[k]就是偏移k个内存的位置,这里的内存指数据类型的大小(type_size),a[k]的内存地址公式为:
a[k]_address = base_address + k * type_size
- 数组的下标是从0开始的,这有两个原因:
(1)CPU寻址可以少执行一个减法指令。如果下标从1开始,则a[k]的内存地址公式为:
a[k]_address = base_address + (k - 1) * type_size
(2)历史原因,最初C语言的设计值就是用0开始计数下标。
- 在C语言中,编译器不执行数组的下标检查工作,因为C语言中只要不是访问受限的内存,所有的内存空间可以自由访问。当数组访问越界时,程序访问的可能是其他变量的内存,从而导致相应内存地址的数据被修改,所以程序员需要做数组的越界检查工作,防止数组越界访问。