一、为什么要学习数据结构?
1.数据结构包括数据对象集以及它们在计算机中的组织方式,即它们的逻辑和物理存储结构,一般我们可以认为数据结构指的是一组数据的存储结构。
2.算法就是操作数据的方法,即如何操作数据的效率更高,更节省资源。
3.所谓线性表,就是将数据排成一条长线一样的结构,数组,链,栈,队列都是线性表结构,线性表上的每个数据最多只能前后两个方向。
二、数组
2.1 定义
数组是一种线性表的数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据,数组的特性:随机访问
(图一)
例如图一所示:01,02,03,就是一段连续的内存空间,整个01,02,03,09,10就是一段不连续的内存空间
2.2 数据的声明以及赋值等相关语句
2.2.1数组的赋值:int [] array = new int[3] //定义一个长度为3的数组
2.2.2给数组指定位置赋值: array[0] = 1; //给数组中第0个元素赋值为1
2.2.3获取数组中的第i个元素:int element = array[0]; //将数组中第0个元素给elemrnt
2.2.4获取数组的长度: int size = array.length; //定义变量size,用于接收数组的长度
2.3 数组的物理结构和逻辑机构
数组的逻辑结构是指我们可以用什么的表示方式来描述数组元素。比如有一个数组a,数组中有n个元素,我们可以使用(a1,a2,a3……,an)来描述数组中的每个元素,当然,从概念可以看出,数组的物理空间就是一块连续的内存单己。
从图中可以看出,访问数组中的元素是通过下标来访问的
2.3.1 计算机给每个内存单元都要分配一个地址,通过地址访问其数据,因此要访问数组中的某个元素时,首先要经过一个寻址公式计算要访问的元素在内存中的地址:
寻址公式:a[1] = baseAddress + i * dataTypeSize
其中dataTypeSize代表数组中元素类型的大小,baseAddress代表内存的起始地址
2.3.2数组下标为什么从0开始
从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移”,如果用array来表示数组的首地址,array[0]就是偏移为0的位置。也就是首地址,array[k]就表示偏移k个type_sized 的位置,所以计算array[k[的内存地址只需要用这个公式:
array[k]_address = base_address + k * type_size
但如果下标从1开始,那么计算array[k]的内存地址会变成:
array[k]_address = base_address + (k-1) * type_size
对比两个公式,不难发现从数组下标1开始如果根据下标去访问数组元素,对于CPU来说,就多了一次减法指令
当然另一方面也是由于历史原因,C语言的设计者使用0开始作为数组的下标,后来的高级语言沿用了这个一设计。
学习资源视频连接:https://www.bilibili.com/video/BV1dX4y1K7NN?p=4&spm_id_from=pageDriver