關於數組的地址計算

數組一般會採用數據存儲結構,數組的順序存儲結構有兩種:

  • 以行序存儲
  • 以列序存儲

數組地址的計算
對於一維數組:若設A[]

A[]={a1,a2,a3....,ai....an}

設每個數組元素佔據d個存儲單元,則元素ai的存儲地址爲
loc(A[i])=loc(A[i])+(i-1)*d

對於二維數組
Amn=
在這裏插入圖片描述
(圖片由all友情提供,一時找不到紙筆emmm)

若爲行序存儲,首元素a11的地址是loc(A[1][1]),Aij有(i-1)行即n*(i-1)個元素,j列前有j-1個元素,每個數據元素佔d個存儲單元,則
loc(Aij)=loc(a11)+[(i-1)*n+j-1]*d,注意此時行列下標均從1開始

若以列序存儲,首元素A11的地址是loc(A[1][1]),Aij有i-1列即m*(j-1)個元素,j行前面有j-1個元素,每個數據元素佔據d個存儲單元,則
loc(Aij)=loc(a11)+[(j-1)*m+(i-1)]*d,注意此時下標從1開始

對於n維數組
loc(j1,j2…,jn)=loc(a1,a2,…an)+(i=1n1(jiai)\displaystyle\sum_{i=1}^{n-1} (j_i-a_i)*k=i+1nbk\displaystyle\prod_{k=i+1}^{n} b_k)✖d
注:其中ai表示n維數組中的第i維的起始座標,d表示一個元素所佔的字節數,bi表示第i維數組的長度

另外,給出簡單例子理解行存儲和列存儲:

\\按行
int i, j; 
for(i=0; i<10; i++)
    for(j=0; j<12; j++) 
    {
    	 .....
    }
	
\\按列
int i, j;
for(j=0; j<12; j++)
    for(i=0; i<10; i++)
    {
        ......
    }

特別注意:
不同類型的數據在內存中佔用的字節數是不同的

//16位
int //2字節
long//4
float//4
double//8
char//1
//32位
int //4
long//4
float//4
double//8
char//1

具體的每個數據所佔字節數需要根據題目要求來計算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章