以下能对二维数组a进行正确初始化的选项是( )。 A. int a[2][ ]={ {1,0,1

以下能对二维数组a进行正确初始化的选项是( )。
A. int a[2][ ]={ {1,0,1},{5,2,3};
B. int a[ ][3]={ {1,2,3},{4,5,6};
C. int a[2][4]={ {1,2,3},{4,5},{6} };
D. int a[ ][3]={ {1,0,1},{ },{1,1} };
正确答案:B
请问D错在哪里?

首先B也有问题,少了“}”,暂且算打印错误吧。
对于D而言,数组的初始化方式有两种,一种是缺省的初始化,例如int a[5];,那么数组里的值将未定义,一种是int a[5]={1};虽然只定义了a[0]的值是1,但是计算机会默认把后面没有定义的全部置0。但是int a[5]={}就非法了,因为没有这种初始化方式,同理,你的二维数组在逻辑上就是一个数组里面的成员全部是数组。所以要按照数组的初始化方式,int a[ ][3]={ {1,0,1},{0 },{1,1} };此处不可缺省{0},因为二维数组你列数是根据{}的数量决定的,缺省了{0}就变成 int a[2 ][3]了追问

谢谢谢谢,我大概明白了,但是书上有一个和这个类似的,是打印错误嘛@_@

追答

你说书本那个?你拿个编译器试试就知道了,绝对是错的。我们简化他,你试试int a[5]={};就这一句就行了,看看编译器能不能给你通过。

追问

我知道B对,A、B我都少敲了一个}

追答

其实我们先认定对于一个数组a[n]={}这样的写法是非法的,a[n]={0]或者a[n];是合法的。对于二维数组(假设是int a[5][5]),我们既可以把他当成一位数组int a[5*5},也可以把他当成5个一位数组:
int (a[0]) [5];
int (a[1]) [5];
.......
int (a[4]) [5];
,如果把他当成a[5*5]的话,我们可以这样初始化int a[5][5]={1},那么除了a[0][0]是1,其他都是默认置0,我们也可以把他当成一个大数组,这个数组里有5个小数组(见上),那么就必须对5个数组都初始化:int a[5][5]={{1,2,3,4,5},{0},{1,2,3},{1}},那么这等同于,对于第一个小数组,初始化为
int a1[5]={1,2,3,4,5},int a2[5]={0},int a3[5]={1},int a4;注意,a4我们没写就等于缺省的初始化了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-09-14
每一行必须三项,可以是任意行。D后面项数不对追问

那C呢?每一行必须四项,后面显然项数不对啊。还有,没有初始化的不是系统自动定义初值为0吗?

追答

C不对啊

B正确

追问

而且你看这个,和d有什么区别嘛@_@

能看清楚图嘛QAQ

追答

晕着了,那题目是错的,应该是选不能的,远A.

C也不对

原题图片呢?

追问

相似回答