一维,二维,三维数组的地址计算

一维数组,二维数组,三维数组中元素的地址计算。地址指的是数组中某个元素在内存中的地址。按数组类型的不同,其每个元素所占的内存大小也不同。
在C++中,一般int占4字节,string占8字节,double占8字节,float占4字节,char占1字节。好像根据编译器的不同,各类型所占的空间大小是不同的= =

规定Loc()函数是取地址的函数 size指该类型数组的一个元素所占的空间大小


0X001 一维数组

一维数组感觉没什么好说的= =

Loc(a[i])=Loc(a[1])+(i-1) * size

直接所求元素的下标减一乘以元素空间大小加上首位元素地址即可。


0X002 行序列序

这里首先得先介绍一下以行为主的数组和以列为主的数组。
如其名,以行序为主序的数组就是 先填满一行,然后转行,例如
a1,a1...a1 ---> a2,a2...a2 ---> am,am...am
以列序为主序就是先填满一列然后转列,例如
a1,a2...am ---> a1,a2...am ---> a1,a2...am


0X003 二维数组

二维数组am,m行n列!

行为主序的数组am,下标从1开始,即a1为第一位元素。求元素ai的地址。
思路就是计算出ai元素前面有多少个元素:

1.计算ai前面的i-1行有多少个元素 n * (i-1)
2.在该元素所在的j行,该元素前有多少个元素 (j-1)

最后可以得出公式

Loc(a[i][j]) = Loc(a[1][1]) + ( n * (i-1) + (j-1) ) * size 

同理 以列为主序的数组am,下标从1开始,即a1为第一位元素。求元素ai的地址。

1.计算ai前面的i-1行有多少个元素 m * (j-1)
2.在该元素所在的j行,该元素前有多少个元素 (i-1)
最后可以得出公式

Loc(a[i][j]) = Loc(a[1][1]) + ( m * (j-1) + (i-1) ) * size

0X004 三维数组

三维数组 a[1..r,1..m,1..n],r为高,m为行,n为列
三维数组 a[1..r,1..m,1..n] 可以看出是 r 个 m * n 的二维数组。如图:

三维数组.png

假设 采用以行为主序的方法存放,即r变化最慢,每次存完一层然后换层。

设首元素为 a1[1] 。那么ai[1](第i层,第一行,第一列的元素)的地址为

Loc(a[i][1][1]) = Loc(a[1][1][1]) + (i-1) * m * n * size

(i-1) m n 即ai[1]元素前有多少个元素

由此推广出 计算任意三维数组元素ai[k]的地址计算公式:
1:该元素前面的(i-1)层有多少元素
2:该元素所在层的(j-1)行有多少元素
3:该元素所在层的(k-1)列有多少元素

最终得出公式:

Loc(a[i][j][k]) = Loc(a[1][1][1]) + ( (i-1) * m * n  + (j-1) * n + (k-1) )* size
添加新评论