数组(顺序存储)基本原理
我们在聊的数组的时候我们会发现对于数组的讲解要对语言进行区分,不同语言之间数组的类型和使用方式还是有些不一样的。
对于数组我们进行区分的时候要分成两大类去进行理解,那么最重要的就是我们的【静态数组】,在完全了解【静态数组】的所有基本操作后,包括增、删、改、查、创,这5大部分。我们便可以学习第二大类【动态数组】,对于动态数组来说我们应该要掌握大量的API操作,来简化我们对于数组的使用。
【静态数组】:我们对于静态数组进行定义的时候就已经说明了,静态数组是真实存在在物理内存中一片连续的内存空间,所以我们在对数组进行操作的时候,最重要的就是操作数组的下标,所以正确的理解和使用下标就成为我们接下来学习和理解的重点。这才是数组最真实的形态。
【动态数组】:是编程语言为了方便我们使用,在静态数组的基础上添加了丰富的API,例如 push,insert,remove等方法。这些API可以使得我们更加灵活的操作数组。
今天我们带着大家实现以下原始的静态数组的,思考动态数组的底层逻辑会更好帮助我们理解。
有了动态数组,后续我们实现到队列,栈哈希表等复杂的数据结构时都会依赖他的API,
接下来我们按照增、删、改、查、创,这5大部分,一一进行分析讲解,准备发车!!!!
静态数组
在创建静态数组的时候我们先要确定数组的类型和大小,因为之前我们说过,对于静态数组时开辟一大片连续空间,开辟后是无法进行修改的。比较麻烦,但是还是有必要了解一下,
定义一个静态数组的方法:【创】
// 定义一个大小为 10 的静态数组
int arr[10];
// 用 memset 函数把数组的值初始化为 0
memset(arr, 0, sizeof(arr));
// 使用索引赋值
arr[0] = 1;
arr[1] = 2;
// 使用索引取值
int a = arr[0];
那么在这个代码中 int arr[10]到底做了什么事情呢?
1、在内存中开辟了一段连续的空间,大小是10*sizeof(int)字节,也就是40个字节,众所周知一个int占4个字节。
2、定义了数组名,其实是定义了名为arr的数组指针,指向的是这个数组的首地址。
那么arr[2]=2又做了什么事情呢?
1、计算arr的首地址加上一个sizeof(int)字节的偏移量,找到第二个元素的首地址。
2、从这个首地址开始的连续4个字节的内存空间中写上了整数2。
我们再把数组详细解释一下:
1、为什么数组的索引从 0 开始?就是方便取地址。arr[0] 就是 arr 的首地址,从这个地址往后的 4 个字节存储着第一个元素的值;arr[1] 就是 arr 的首地址加上 1 * 4 字节,也就是第二个元素的首地址,这个地址往后的 4 个字节存储着第二个元素的值。arr[2], arr[3] 以此类推。
2、因为数组的名字 arr 就指向整块内存的首地址,所以数组名 arr 就是一个指针。你直接取这个地址的值,就是第一个元素的值。也就是说,*arr 的值就是 arr[0],即第一个元素的值。
3、如果不用 memset 这种函数初始化数组的值,那么数组内的值是不确定的。因为 int arr[10] 这个语句只是请操作系统在内存中开辟了一块连续的内存空间,你也不知道这块空间是谁使用过的二手内存,你也不知道里面存了什么奇奇怪怪的东西。所以一般我们会用 。
memset 函数把这块内存空间的值初始化一下再使用。
注:在使用memset函数是要注意类型,int类型下memset可以初始化0或-1,其他的可能会出现问题,但是字符类型下可以初始化成任意字符。
总结
静态数组本质上就是一块连续的内存空间,int arr[10] 这个语句我们可以得知:
1、我们知道这块内存空间的首地址(数组名 arr 就指向这块内存空间的首地址)。
2、我们知道了每个元素的类型(比如 int),也就是知道了每个元素占用的内存空间大小(比如一个 int 占 4 字节,32 bit)。
3、这块内存空间是连续的,其大小为 10 * sizeof(int) 即 40 字节。
所以,我们获得了数组的超能力「随机访问」:只要给定任何一个数组索引,我可以在 O(1) 的时间内直接获取到对应元素的值。
因为我可以通过首地址和索引直接计算出目标元素的内存地址。计算机的内存寻址时间可以认为是 O(1),所以数组的随机访问时间复杂度是 O(1)。
增删改查
对于我们以后学习的数据结构方面的一些知识,我们重要的是学习关于增删改查这几个方面的底层原理,对于数组来说也是通过下标进行修改和访问对应元素的。
增
对于增操作来说我们要分类讨论:
1、末尾进行增加:
比方说,我有一个大小为 10 的数组,里面装了 4 个元素,现在想在末尾追加一个元素,怎么办?
其中我们只需要在末尾直接赋值一个就可以了。
// 大小为 10 的数组已经装了 4 个元素
int arr[10];
for (int i = 0

最低0.47元/天 解锁文章
1865

被折叠的 条评论
为什么被折叠?



