怎么计算三维数组的存储地址?

三维数组A[0...4,0...5,0...6],采用以行序为主序的方式存储,每个数据元素占2个存储单元,且第一个元素的存储地址是120,则A[3,4,5]的存储地址是?

假设数组各维的下界是不是1,二维数组A(mn)按“行优先顺序”存储在内存中,假设每个元素占用d个存储单元。元素a(ij)的存储地址应是数组的基地址加上排在a(ij)前面的元素所占用的单元数。因为a(ij)位于第i行、第j列,前面i-1行一共有(i-1)×n个元素,第i行上a(ij)前面又有j-1个元素,故它前面一共有(i-1) ×n+j-1个元素。
因此,a(ij)的地址计算函数为:LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d。
同样,三维数组A(ijk)按“行优先顺序”存储,其地址计算函数为:LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p+(k-1)]*d。

上述讨论均是假设数组各维的下界是1,更一般的二维数组是A[c1..d1,c2..d2],这里c1,c2不一定是1。a(ij)前一共有i-c1行,二维数组一共有d2-c2+1列,故这i-c1行共有(i-c1)*(d2-c2+1)个元素,第i行上a(ij)前一共有j-c2个元素。
因此,a(ij)的地址计算函数为:LOC(aij)=LOC(ac1c2)+[(i-c1)*(d2-c2+1)+j-c2)]*d。

例如,在C语言中,数组各维下标的下界是0,因此在C语言中,二维数组的地址计算公式为:LOC(aij)=LOC(a00)+(i*(d2+1)+j)*d。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-03
可以自己画个图例算一下嘛!
array[5,6,7]可以看做三重意思考虑,首先array是一个有5个元素组成的数组,即array[0],...array[4];
其次,每个数组元素又是一个二维数组,二维的你应该可以搞定的吧,这样第一层的每个数组元素大小应该是6*7*2=84 个存储单元,也就有每个第一层数组元素array[i](i为0,1,2,3,4)的起始地址为120+i*84,按照这个规律再去推剩下的二维不久很小case了嘛!
array[i][j](i为0,1,2,3,4,j为0,1,2,3,4,5)起始地址为120+i*84+j*14;
最后array[i][j][k]的地址应该为120+i*84+j*14+k*2,其中i为0,1,2,3,4,j为0,1,2,3,4,5,k为0,1,2,3,4,5,6.本回答被提问者采纳
相似回答