二维数组的初始化与遍历
二维数组的初始化可以为下面的形式:
int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };
上面的方式就初始化了一个5行3列的数组。
对于二维数组的遍历,可以先列后行(即先遍历列,再遍历行),也可以先行后列(即先遍历行,再遍历列)进行。比如,对于一个m行n列的整型二维数组a[m][n]进行遍历:
//先行后列:
for(int i = 0; i < m;i++)
{
for(int j = 0; j < n; j++)
{
printf(“%d/n”,
a[i][j]);
}
}
//输出为:a[0][0]
a[0][1] a[0][2] a[0][3]…a[0][9]...
//先列后行:
for(int i = 0; i < n;i++)
{
for(int j = 0; j < m; j++)
{
printf(“%d/n”, a[j][i]);
}
}
//输出为:a[0][0]
a[1][0] a[2][0] a[3][0] a[4][0]
那么,这两种遍历方法,哪个更高效一些呢?
数组的元素由于是连续存放在内存中的,所以支持随机访问(即直接给出元素的下标,即可计算并取得其值)。如果数组比较小,能够在一个内存页中存放下,那么在对数组进行访问的过程中不会发生缺页中断等情况,因此先行后列和先列后行访问数组的效率差别不大。但是如果数组的数据比较大,一个内存页无法容纳下,由于数组是按行的顺序存放的,同一列的数据就有可能存放在不同的页中,那么先列后行的访问将引起更多的缺页中断,降低了遍历的效率。