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。注意,在这种情况下,需要内层花括号对,以强制正确地初始化。如果没有这些括号,将初始化前两行和第三行的前两个元素(自己验证这种说法。)