关于数组的地址计算

数组一般会采用数据存储结构,数组的顺序存储结构有两种:

  • 以行序存储
  • 以列序存储

数组地址的计算
对于一维数组:若设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

具体的每个数据所占字节数需要根据题目要求来计算

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