一:数组的类型定义
数组是有类型相同的数据元素的有序集合
二:数组的顺序储存
数组为什么不采用链式存储结构?
1:数据的结构固定(维数和维界不变),也就是说一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动
2:数组只有存取和修改元素的操作,一般不做插入和删除元素操作
三:多维数组物理地址寻址:
-
注:r表示数据类型所占字节大小 m是行序,n是列序
二维数组Amn物理地址计算公式:
- 按行序求地址: Loc(aij)= Loc(a11) + ((i-1) *n + (j-1)) *r
- 按列序求地址: Loc(aij)= Loc(a11)+ ((j-1) * m + (i-1)) *r
- 从0号位置开始寻址: 按行寻址: Loc(aij)= Loc(a11) + (i*n +j) *r
推广到一般的二维数组A[c1d1][c2d2]则有
- 按行序求物理地址: Loc(aij)= Loc(ac1c2)+ ((i-c1) * (d2-c2+1) + (j-c2)) *r
- 按列序求物理地址: Loc(aij)= Loc(ac1c2)+ ((j-c2) * (d1-c1+1) + (i-c1)) *r
三维数组:Amnp
- 从第1号位置开始寻址:
Loc(aijk)= Loc(a111) + ((i-1)np + (j-1)*p + k-1) r
2.从第0号位置开始寻址:
Loc(aijk) = Loc(a000) + ==(i n* p + j * p + k)== * r
推广到一般三维数组A[c1d1][c2d2][c3~d3]
-
按行序寻址: Loc(aijk) = Loc(ac1c2c3) + ((i-c1)(d2-c2+1)(d3-c3+1)
+(j-c2)*( d3-c3+1) + (k-c3+1)) *r
-
按列序寻址:
Loc(aijk) = Loc(ac1c2c3) + ((k-c3)(d2-c2+1)(d1-c1+1) +(j-c2)*( d1-c1+1) + (i-c1+1)) *r
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210503185028667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUyNTg2NTUw,size_16,color_FFFFFF,t_70)
三维数组按行序存储时可以看做时图片中的绿色部分,按列存储时看做是黄色区域往下一页依次存储。
【练习题】
(1)设二维数组A[1m][1n](即m行n列)按行存储在数组B[1~m*n]中,则二维数组元素A[i][j]在一维数组B中的下标为?
解:
一维数组和二维数组都是从1号位置开始存储,所以只需要算出A[i][j]是存在二维数组中的第几号位置上就可得出结果: (i-1)*n + j
(2)将整型数组A[18][-49][4~11]存储在起始地址为1000的连续的内存单元中若按行优先次序则元素A[7][3][9]的地址是?若按列优先次序则元素A[7][3][9]的地址是?
解:
可以看出此三维数组的第一维度有m=8-1+1 = 8个空间
第二维度有n=9-(-4)+1=14个空间
第三维度有p=11-4+1=8个空间
每个数据元素占4个存储空间
所以根据寻址的公式可求出
Loc(A[7][3][9]) = 1000 +( (7 - 1)np + (3-(-4))*p + (9-4+1))*4 = 3936(按行)
Loc(A[7][3][9]) = 1000 +( (9 - 1)mn+ (3-(-4))*m + (7-4+1))*4 = 4824(按列)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)