版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
数据结构-二维数组存储结构
一、随机访问地址计算
前情提要:
下文中说到的地址,在c语言和c++语言里叫指针,与现实生活中每个家庭都有家庭地址一样类似的概念,但是真正细究起来,c语言和c++语言里的地址和真实的主存地址,也就是物理地址又是不一样的,主要原因是有一个计算机操作系统管理着你写的程序具体在哪一个物理内存块,所以c语言和c++语言里的地址也叫做虚拟地址,虚拟地址到物理地址映射是操作系统的内存管理实现的,这里说起来又是一堆的话。
两种存储方式
数组具有随机访问特点,要求能够依据下标计算出任一数组元素的存储地址(概念上的地址):
计算机主存的每个地址和存储内的每个字节是一一对应的,而每个字节间的排列顺序是线式的。在计算元素地址之前需要了解二维数组的两种存储方式:
二维数组具有两种存储方式:
1、以行为主顺序优先存储:
因为aij是二维数组中第i行,第j列的元素,第(i−1)行共(i−1)n个元素,在第i行中前面已经存放了(j−1)个元素,故在aij前面共放了(i−1)n+(j−1)个元素;
令每个元素占用空间e个单位
以第一个a11的地址address(a11)为基地址可以得到:
address(aij)=address(a11)+((i−1)n+(j−1))e
如果以任意的A[c1..d1,c2..d2](其中c1、c2表示基地址元素;d1−c1+1、d2−c2+1表示数组的行数和列数)可得:
address(aij)=address(ac1c2)+((i−c1)(d2−c2+1)+(j−c2))
2、以列为主顺序优先存储:
因为aij是二维数组中第i行,第j列的元素,第(j−1)列共(j−1)m个元素,在第i行中前面已经存放了(i−1)个元素,故在aij前面共放了(j−1)m+(i−1)个元素;
令每个元素占用空间e个单位
以第一个a11的地址address(a11)为基地址可以得到:
address(aij)=address(a11)+((j−1)m+(i−1))e
如果以任意的A[c1..d1,c2..d2](其中c