对于一个M行N列的二维数组,可以看成是M行一维数组,一维数组是N列。例如 int array[3][2]; 是一个3行2列的二维数组,其实,如同3个一维数组,一维数组是2列。那么,对3行2列的二维数组可以初始化如下:
int array[3][2] = {{1, 2}, {3, 4}, {5, 6}};
相当于:
(1) {1, 2}数据,赋给array[0][] 表示第 1行数组;
(2) {3, 4}数据,赋给array[1][] 表示第 2行数组;
(3) {5, 6}数据,赋给array[2][] 表示第 3行数组;
这种赋值方式,称为:分组赋值,每一组数据,赋给相应的一行数组元素。
二维数组的初始化赋值,还可以是连续赋值,例如:
int array[3][2] = {1, 2, 3, 4, 5, 6};
此时,就把{1, 2, 3, 4, 5, 6}表示的一组数据,赋给二维数组。赋值的规则如下:
(1) array[3][2]表示3行2列数据;每一行是2个元素;
(2) 从{1, 2, 3, 4, 5, 6}中取出2个元素,赋给第一行元素;所以,第一行元素得到{1, 2}数据组,剩下{3, 4, 5, 6}数据组;
(3) 从{3, 4, 5, 6}数据组中取出2个元素,赋给第二行元素,所以,第二行元素得到{3, 4}数据组,剩下{5, 6}数据组。
(4) 从{5, 6}数据组中取出2个元素,赋给第三行元素,所以,第三行元素得到{5, 6}数据组,没有剩下任何数据。
(5) 最终,把初始化赋值的数据组划分成一行一行元素,设置到二维数组中。
注意:如果初始化赋值数据组的元素比二维数组元素少,例如:
int array[3][2] = {1, 2, 3};
此时,只够设置前3个元素,那么,剩下的数组元素,默认设置为0值。程序测试例子如下:
程序运行结果如下:
可以看到,对array数组和array1数组的赋值,都是对所有的元素设置了有效值。对array3数组的赋值,初始化赋值{1, 2, 3}数据组,只能够设置前3个数值元素,后面没有初始化值的数组元素,默认设置为0值。
在上面的例子中,初始化array1数组的时候,有:
int array1[3][2] = {1, 2, 3, 4, 5, 6};
那么,根据array1数组定义的列数为2,表示2个元素表示一行数据。所以,从初始化列表{1, 2, 3, 4, 5, 6}中取出2个元素来设置给一行数组。最终,根据列数是2,就可以2个元素划分为一组数据,得到{{1, 2}, {3, 4}, {5, 6}}这样的数据组。在这个划分数据的过程中,只有列数2对划分数据有影响,行数没有任何影响。
所以,我们可以在初始化定义数组的时候,不用给出行数的定义,例如:
int array1[][2] = {1, 2, 3, 4, 5, 6};
此时,定义array1二维数组,定义数组的时候初始化,确定了列数之后,可以不用给出行数的定义。那么,根据列数是2,从初始化数值列表中,取出2个数据作为一行,得到{{1, 2}, {3, 4}, {5, 6}}数据组。此时,可以看到是3行数据组,那么,定义的数组就是有3行。程序测试例子如下:
程序运行结果如下:
可以看到,定义了二维数组a的列数是3,所以,一行数组存放3个元素。那么,第一行划分得到{1, 2, 3}数据,填充都第一行数组中;第二行划分得到{4, 5}数据;填充到第二行数组中。由于数组定义一行是3个元素,所以,第二行划分得到{4, 5}数据不够存放到a[1][2]元素,所以,a[1][2]元素用零填充;整个数组的长度是6个元素。
在上面的代码中,a[][]数组的元素是char类型,有6个元素。所以,数组使用sizeof()获取数组的容量,得到6个字节的容量。因为,一个char类型是占用1个字节,所以,6个元素就占用1*6 = 6个字节的容量。