【正确答案】
【答案解析】要弄清楚这个问题,需要弄清楚二维数组默认初始化的问题。原则上来说,二维数组在内存中既可以按行存储,也可以按列存储,但一般是按行存放的,即先存储第一行的数组元素的值,再按顺序存放第二行的数组元素的值,以此类推。以数组a[m][n]为例,按行存储,在内存中的结构如下:
a[0][0]→a[0][1]→a[0][2]→a[0][3]→a[1][0]→a[1][1]→a[1][2]→a[1][3]→a[2][0]→a[2][1]→...
而对二维数组的初始化,其初始化的形式如下:
数据类型数组名[整常量表达式][整常量表达式]={初始化数据};在{}中给出各数组元素的初值,各初值之间用逗号分开。把{}中的初值依次赋给各数组元素。
二维数组的初始化一般有两种方式,第一种方式是按行来执行(如int array[2][3]={{0,0,1),{1,0,0));),而第二种方式是把数值写在一块(如int array[2][3]={0,0,1,1,0,0);)。
此时存在一种情况,即只对部分元素进行初始化,当数组中非零元素比较少时,则可以对部分元素赋初值,未赋值的元素自动为0。例如,int a[3][4]={{1),{5),{9}},则数组中各值可以表示如下:
1 0 0 0
5 0 0 0
9 0 0 0
再例如 int a[4][5]={{1,2},{},{0,1,3}},则各值表示如下:
1 2 0 0 0
0 0 0 0 0
0 1 3 0 0
0 0 0 0 0
再例如int a[2][3]={{5,6},{7,8}},则二维数组的存储如下:
5 6 0
7 8 0
再例如 int a[2][3]={5,6,7,8},则按行存储格式如下:
5 6 7
8 0 0
本题中,由于数组a是一个二维数组,第一行第一个数是1,第二行第一个数是2,第二个数是3,其他位置数的值自动补0,所以第一行第二个数也就是a[0][1],它的值是0。
有一种情况比较特殊,如果对二维数组的所有元素都赋值,则数组的第一维的长度可以不指定,但第二维的长度不能省。
例如,int m[][3]={1,2,3,4,5,6,7,8,9},则默认第一维的维数值为3。
int m[][3]={1,2,3,4,5,6,7},则默认第一维的维数值为3,其中m[2][1]=m[2][2]=0。
int m[][3]={{0,0,2},{},{0,2}},则默认第一维的维数值为3。
需要注意的是,只有在进行带有初始化数据的数组说明时,才允许省略第一维长度,在仅仅进行说明数组而未进行初始化数组元素时省略长度是错误的,因为编译系统无法预知数组大小,如int a[][4]就是错误的。