在计算机里,所有的数据结构本质上可以归为两类:数组和链表
数组的内存模型
1.一维数组
什么是数组?
在计算机科学中,数组可以被定义为是一组被保存在存储连续空间中,并且具有相同类型的数据元素的集合。而数组中的每一个元素都可以通过索引来进行访问。
例:以java语言中一个例子说明一下数组的内存模型,当定义了一个拥有5个元素的int数组后,看看内存是长什么样子?
int[] data = new int[5];
通过上面的声音,计算机会在内存中分配一段连续的空间给这个data数组。现在假设在一个32位上的机器上运行这段程序,java的int类型的数据占据了4个字节的空间,同时也假设计算机分配的地址是从0X80000000开始的,整个data数组在计算机内存中分配的模型如下图所示:
这种分配连续空间的内存模型同时也揭示了数组在数据结构中的另外一个特性,即随机访问(Random Access),随机访问这个概念在计算机科学中被定义为:可以用同等的时间访问到一组数据中的任意一个元素。这个特性除了和连续的内存空间模型有关以外,其实也和数组如何通过索引访问到特定的元素有关。
在计算机中,为什么在访问数组中的第一个元素时,程序一般都是表达成以下这样的:
data[0]
也就是说,数组的第一个元素是通过索引“0”来进行访问的,第二个元素是通过索引“1”来进行访问的,......,这种从0开始进行索引的编码的方式被称为“Zero-based Indexing”。当然了在计算机世界中,也存在着其他的编码方式,像Visual Basic中的某些函数索引采用1-based Indexing的,也就是说第一个元素是通过索引“1”来获取的,像这种方式就不多说了。等以后有时间慢慢研究。
为什么数组的第一个元素要用过索引“0”来进行访问呢?原因就在于获取数组元素的方式是按以下的公式来进行获取的:
base_address + index(索引) * data_size(数据类型大小)
索引在这里可以看做是一个偏移量(Offset),还是以上面的例子来进行说明:
data这个数组被分配到的起始地址是0X80000000,是因为int类型数据占据了4个字节的空间,如果我们要访问第五个元素data[4]的时候,按照上面的公式,只需要取得0X80000000 + 4 * 4 = 0X80000010这个地址的内容就可以了。随机访问的背后原理其实也就是利用这个公式达到了同等的时间访问到一组数据中的任意元素。
2.二维数组
<