13.1.3 多维数组
到目前为止看到的数组都是线性数组,也就是,它们都是一维的。C语言允许定义任意维的数组。本节将讲述二维数组。
二维数组最自然的应用之一是矩阵。考虑下面的4×5矩阵:
10 5-3 17 82
9 0 0 8 -7
32 20 1 0 14
0 0 8 7 6
在数学中,通常通过双下标来引用矩阵中的元素。如果将上面的矩阵命名为M,符号Mi, j则代表在第i行第j列的元素,其中i的范围从1到4,j的范围从1到5。符号M3,2指的是值20,它位于矩阵第3行第2列。类似地,M4,5指的是第4行第5列的元素(值为6)。
在Objective-C语言中,在引用二维数组的元素时也使用类似的概念。然而,因为Objective-C语言都是从0开始计数的,所以矩阵的第一行实际上是0行,而第一列是0列。那么上面矩阵的行列标识如下图表所示:
行(i)列(j)
0 1 2 3 4
0 10 5-3 17 82
1 9 0 0 8-7
2 32 20 1 0 14
3 0 0 8 7 6
在数学上使用符号Mi,j,而Ojective-C语言中使用等价的符号:
M[i][j]
记住,第一个索引指的是行数,而第二个索引指的是列数。因此,语句
sum=M[0][2]+M[2][4];
将0行2列的数值(-3)和2行4列的数值(14)相加,并将结果11赋给变量sum。
定义二维数组的方式和一维数组的相同,于是
int M[4][5];
声明M为4行5列的二维数组,总共包含20个元素。数组中的每个位置都包含整型值。
初始化二维数组的方法类似于一维等价数组的初始化方式。列出初始化元素时,它们的值是根据行排列的。大括号对用来分隔初始化的各行。因此,要将数组M定义和初始化为前面表中列出的元素,可以使用下面的表达式:
int M[4][5]={
{10,5,-3,17,82},
{9,0,0,8,-7},
{32,20,1,0,14},
{0,0,8,7,6}
};
特别注意上一个语句的语法。除了最后一行,每行结束的大括号之后必须加上逗号。实际上,内层括号可以省略。如果没有内层括号,将按行进行初始化。所以上一个语句可以如下编写:
int M[4][5]={10,5,-3,17,82,9,0,0,8,-7,32,
20,1,0,14,0,0,8,7,6};
和一维数组一样,也不必初始化整个二维数组。如下语句
int M[4][5]={
{10,5,-3},
{9,0,0},
{32,20,1},
{0,0,8}
};
只初始化了矩阵每行的前三个元素。其余的值都设为0。注意,在这种情况下,需要内层花括号对,以强制正确地初始化。如果没有这些括号,将初始化前两行和第三行的前两个元素(自己验证这种说法。)