数组下标为什么从 0 开始?
0 开始的寻址
a[k]_address = base_address + k * type_size
1 开始的寻址
a[k]_address = base_address + (k-1)*type_size
数组的随机访问为什么高效?
因为数组内部是一个连续的内存空间且是线性的,数组在初始化时就已经分配了一块连续的内存空间,首地址是 bash_address = 1000,比如说我们第一位放置 int 类型的,那么其占位字节就是 4,也就是 1000-1003 的地址代表的是第一位,以此类推,所以我们可以通过 address 来访问内存中的数据,当计算机进行访问时,会通过寻址,找到该元素在数组中的内存地址,从而获取该元素。同样为了契合分配的首地址,所以数组中一般下标从 0 开始,也有一定的历史原因。
数组的插入和删除为什么是低效的?
数组插入和删除都要对数组内存空间进行重排,因为数组是线性结构的,所以在插入某一个元素到指定的位置时,那么后面的元素的内存地址就要发生变化,假如我们把元素插在最后一位,那么我们需要为当前的数组进行动态的扩容,然后插入,此时不需要发生任何元素的移动,只需要扩容即可,所以时间复杂度是O(1);如果我们将元素插入到首地址位置,那么后面所有的元素的地址都要发生变化,也就是元素发生移动,假设我们原数组中有 n 个元素,这个时候元素们就需要挪动 n 次,时间复杂度就是 O(n),综上,数组插入到指定位置的元素的时间复杂度是 O(n-k)。所以说数组的插入是低效的,同理,删除也是一样。
高级语言数组越界为什么要抛出异常?
c 语言中,所有的连续内存空间都是可以访问的,只要不是访问受限的内存,那么当数组越界时,如果我们访问越界,而该越界元素在原来的数组中存在,那么就会定位到原元素所在的内存空间,程序在编译时并不会报任何的错误,但是在实际的开发过程中会发生很多意想不到的意外,如果不报异常,那么我们在 for 循环中访问越界,而该元素恰好又在原数组中,那么就会造成无限循环。所以高级语言对数组越界会抛出异常