数组

点点圈 提交于 2019-12-11 19:03:27

概念

  数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型;数组具有连续的内存空间,存储相同类型的数据,正式该特性使得数组具有一个特性:随机访问。但是有利有弊,这个特性虽然使得访问数组变得非常容易,但是也是的插入和删除操作会变得很低效,插入和删除数据后为了保证连续性,要做很多搬迁工作。

数组中元素的访问

我们拿一个长度为10的数组来举例,int [] arr = new int[10],  在下面的途中,计算机给数组分配了一块连续的空间,100-139,其中内存的起始地址为baseAddress = 100

                           

  我们知道,计算机给每个内存单元都分配了地址值,通过地址来访问其数据,因此要访问数组中的某个元素时,首先要经过一个寻址公式计算要访问的元素在内存中的地址。

a[i] = baseAddress + i * dataTypeSize

其中,baseAddress = 100,dataTypeSize代表数组中的元素类型大小,在这个例子中,存储的是int类型数据,因此dataTypeSize = 4个字节

数组下标为什么从0开始

数组下标为什么要从0开始而不是从1开始呢?

从数组存储的内存模型上来看,“下标最确切的定义应该是偏移(offset)”。前面也讲到,如果用array来表示数组的首地址,array[0]就是偏移为0的位置,也就是首地址,array[k]就表示偏移k个type_size的位置,所以计算array[k]的内存地址只需要用这个公式:

arrar[k]_address = base_address + k*type_size

但是如果下标从1开始,那么计算array[k]的内存地址值会变成:

arrar[k]_address = base_address + (k-1)*type_size

对比两个公式,不难发现从数组下标从1开始如果根据下标去访问数组元素吗,对于CPU来说,就多了一次减法指令。

d

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!