數組元素存儲地址的計算
一維數組
設一維數組A[n]存放在n個連續的存儲單元中,每個數組元素占一個存儲單元(不妨設為C個連續字節).如果數組元素A[0]的首地址是L,則A[1]的首地址是L+C,A[2]的首地址是L+2C,… …,依次類推,對于有:
?
二維數組
二維數組的每個元素含兩個下標,如果將二維數組的第一個下標理解為行號,第二個下標理解為列號,然后按行列次序排列個元素,則二維數組呈陣列形狀。例如
它是一個行號為1~m,列號為1~n的二維數組元素陣列。
如何保存二維數組?
首先要確定一個順序
?
????????? ???????????
??????????????????? 第0行??????? 第1行??????? 第2行
?
????????? ???????????
?
??????????????????? 第0列??????? 第1列??????? 第2列
?
?
????????? ???????????
?
????????? ???????????
?
?
?
?
?
?
?
?
?
?
設count為數組B中元素的個數,則count=9
按行優先存儲
?
? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
… |
|
|
|
|
|
|
|
|
| … |
????????? 第0行???????????????? 第1行??????????????? 第2行??
?
?
按列優先存儲
?
? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
… |
|
|
|
|
|
|
|
|
| … |
?
????????? 第0列???????????????? 第1列??????????????? 第2列??
?
地址如何計算?
所謂按行優先順序,就是將數組元素按行向量的順序存儲,第個行向量存儲在第個行向量之后。
下面我們計算二維數組中任一元素A[i][j]的存儲地址,設每個數組元素所占空間為個連續字節。顯然,A[i][j]是第個行向量B[i]中的第個元素。
?
? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
… |
|
|
|
|
|
|
|
|
| … |
????????? 第0行?????????????? ??第1行??????????????? 第2行??
?
在A[i][j]之前的元素個數為u,分別是A[0][0],A[0][1],A[0][2],…,A[0][n],A[1][0],A[1][1],A[1][2],…,A[1][n],…,A[i-1][0],A[i-1][1],A[i-1][2],…,A[i-1][n],A[i][0],A[i][1],A[i][2],…,A[i][j-1]
設每個數組元素所占空間為個連續字節。
則
Loc(A[i][j])=Loc(A[0][0])+u*C
u=?
前i行(第0行到第i-1行)(每行n個元素)的元素個數+第i行的元素個數(A[i][0]到A[i][j-1])
因此,u=i*n+j
故
Loc(A[i][j])=Loc(A[0][0])+u*C
=Loc(A[0][0])+(i*n+j)*C
按列優先存儲
?
? | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ? |
… |
|
|
|
|
|
|
|
|
| … |
?
????????? 第0列???????????????? 第1列??????????????? 第2列??
?
地址如何計算?
在A[i][j]之前的元素個數為v,分別是A[0][0],A[1][0],A[2][0],…,A[m][0],A[0][1],A[1][1],A[2][1],…,A[m][1],…,A[0][j-1],A[1][j-1],A[2][j-1],…,A[m][j-1],A[0][j],A[1][j],A[2][j],…,A[i-1][j]
設每個數組元素所占空間為個連續字節。
則
Loc(A[i][j])=Loc(A[0][0])+v*C
v=?
前j列(第0列到第j-1列)(每列m個元素)的元素個數+第j列的元素個數(A[0][j]到A[i-1][j])
因此,v=j*m+i
故
Loc(A[i][j])=Loc(A[0][0])+v*C
=Loc(A[0][0])+(j*m+i)*C
高維數組
按行優先:“左”下標優先,即第一(最左)下標的下標值較小的元素較先存儲,第一個下標值相同者,按第二下標優先存儲,對任意的k>1,對第1~(k-1)維相同者,先存儲第k維中下標值較小者。
按列優先:“右”下標優先(最后一維下標為最右),先存儲第n維下標值較小者,第n維下標值相同者,先存儲第n-1維下標值較小者。
三維數組D[3][3][4]的順序存儲次序是
元素表示為D[i][j][k]??? 其中,0≤i≤2,0≤j≤2,0≤k≤3,
?
可以把它看作一維數組
B1[3]= { D[0][3][4],D[1][3][4],D[2][3][4]}
?
?
?
|
D[0][0][0],D[0][0][1],D[0][0][2],D[0][0][3]
D[0][1][0],D[0][1][1],D[0][1][2],D[0][1][3]
D[0][2][0],D[0][2][1],D[0][2][2],D[0][2][3]
?
|
D[1][0][0],D[1][0][1],D[1][0][2],D[1][0][3]
D[1][1][0],D[1][1][1],D[1][1][2],D[1][1][3]
D[1][2][0],D[1][2][1],D[1][2][2],D[1][2][3]
?
|
D[2][0][0],D[2][0][1],D[2][0][2],D[2][0][3]
D[2][1][0],D[2][1][1],D[2][1][2],D[2][1][3]
D[2][2][0],D[2][2][1],D[2][2][2],D[2][2][3]
?
?
For? x=0? to?2?do
?? For? y=0? to?2? do
????? For? z=0?to? 3? do
D[i][j][k]的地址:
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
第一個下標的變化:0到i-1,共i*3*4個元素
第一個下標為i時,第二個下標的變化:0到j-1,共j*4個元素
第一個下標為i,第二個下標為j時,第三個下標的變化:0到k-1,共k個元素
w= i*3*4+j*4+k
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
=Loc(D[0][0][0])+(i*3*4+j*4+k)*C
?
For? z=0?to? 3? do
?? For? y=0? to?2? do
????? For? x=0?to? 2? do
?
?
?
?
|
|
D[0][0][0],D[1][0][0],D[2][0][0]
D[0][1][0],D[1][1][0],D[2][1][0]
D[0][2][0],D[1][2][0],D[2][2][0]
|
?
|
D[0][0][1],D[1][0][1],D[2][0][1]
D[0][1][1],D[1][1][1],D[2][1][1]
D[0][2][1],D[1][2][1],D[2][2][1]
|
?
|
D[0][0][2],D[1][0][2],D[2][0][2]
D[0][1][2],D[1][1][2],D[2][1][2]
D[0][2][2],D[1][2][2],D[2][2][2]
|
?
|
D[0][0][3],D[1][0][3],D[2][0][3]
D[0][1][3],D[1][1][3],D[2][1][3]
D[0][2][3],D[1][2][3],D[2][2][3]
?
For? z=0?to? 3? do
?? For? y=0? to?2? do
????? For? x=0?to? 2? do
D[i][j][k]的地址:
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
第三個下標的變化:0到k-1,共k*3*3個元素
第三個下標為k時,第二個下標的變化:0到j-1,共j*3個元素
第三個下標為k,第二個下標為j時,第一個下標的變化:0到i-1,共i個元素
w= k*3*3+j*3+i
?
Loc(D[i][j][k])=Loc(D[0][0][0])+w*C
=Loc(D[0][0][0])+(k*3*3+j*3+i)*C
?
?
n維數組
For? =0? to? ??do
?? For? =0? to? ??do
?????????? …? …? …? …?
????? For? =0? to? ??do
s = ?
的變化:0~-1,共***…*=*個元素
等于時,的變化:0~-1,共**…*=*個元素
等于時,等于時,的變化:0~-1,共**…*=*個元素
…? …? …? …?
等于時,等于時,…,等于時,的變化:0~-1,共個元素
故
s=*+*+*+…+*+
??????????????