数组一般会采用数据存储结构,数组的顺序存储结构有两种:
- 以行序存储
- 以列序存储
数组地址的计算
对于一维数组:若设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
=
1
n
−
1
(
j
i
−
a
i
)
\displaystyle\sum_{i=1}^{n-1} (j_i-a_i)
i=1∑n−1(ji−ai)*
∏
k
=
i
+
1
n
b
k
\displaystyle\prod_{k=i+1}^{n} b_k
k=i+1∏nbk)✖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
具体的每个数据所占字节数需要根据题目要求来计算