c语言关于定义二维数组的问题

为什么可以a[][4]={*,*,*……}这样定义,而不能定义
a[3][]={*,*,*……}。
a[][4]={1,2,3,4,5}
那这样定义怎么办。
它是不是有可能认为是
1 2 3 4
5 0 0 0
0 0 0 0
或者更多行的“0”。

首先你要理解二维数组的真正含义,它的第一维就是一组数据的起始地址,第二维就是某组数据中的某个值.其次,你要知道a[][4]所表达的意思,是指二维数组a的每一维都是由4个元素组成的一维数组.而编译器可以根据你赋给a的初值个数计算它的第一维长度(元素总个数/4,如果不能整除,则长度加1,此时还应该有几个没有赋初值的数组元素).而a[3][]的意思从表面上看可以成立,但问题是编译器不能直接识别其第二维的确切长度(你可以考虑,如果总的初值个数为2时,可以认为a的第二维长度为1,也可以是2,.......),这样就会产生错误.所以,可以a[][4]={*,*,*……}这样定义,而不能定义a[3][]={*,*,*……}。
对于你补充的问题,其实我已经讲了.因为赋初值是5个元素,所以5/4=1,但除不尽,所以要加1,即实际数组a实质上定义为a[2][4],其内元素为:
1 2 3 4
5 0 0 0 (后面的三个0是系统默认值)
希望对你有所帮助.^-^
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-10-30
首先 假如定义一个一维数组 int ary[];
缺少了一维数组的长度 系统无法按大小分配空间;
但假如int ary[] = {1,2};
就可以根据初始化的元素个数来把ary定义成相当于ary[2];

这应该能懂

再次
c语言中没有多维数组的概念 我们平常说的二维数组其实是“数组的数组” c语言对多维数组的定义也是定义成
"数组的数组的数组的..."
所以 当定义二维数组int a[][4] = {1,2,3,4,5,6,7,8};
其实是 “定义了两个以[4]为长度的数组”(这说法可能不准确)

所以在定义二维数组并初始化时 需要指明第二维的长度 好让编译器根据初始化元素的个数来确定数组的大小

文字表述欠缺专业 但 意思是这样 希望能明白
呵呵
第2个回答  2007-10-30
主要是分配内存的问题.
a[i][j]是数组的数组,意思是定义i个元素的数组,每个元素都是一个含有j个元素的数组.
a[][4]是定义了n个含有4个元素的数组,如:
a[][4]={{1,2,3,4},{5,4,3,2},{6,7,8,9}}是定义了3个"含有4个元素的数组"的数组.虽然3个自定义的,但是是确定的数字。程序可以分配内存.
而a[3][]是定定义了3个"含有n个元素的数组"的数组.如:
a[3][]={{1,2,3}{3,4}{5,6}},由于n的值是不确定的(如上有3个的,2个的),所以程序无法为这个数组分配内存空间.
相似回答