C语⾔为什么定义⼀个⼆维数组,⾏数可以省略,列数不可以定义⼆维数组时,省略之后要让计算机能够确定你定义的⼏⾏⼏列才可以。
假如你省略⾏数,但是确定了列数,计算机会根据你的列数的数值以及你初始化时给的数据,⾃动确定⾏数,因此⾏数可以省略。但是如果给了⾏数但没有确定列数,对于你初始化的数据,计算机不知道怎么划分,是平均分呢?还是其他⽅式分呢?这是没有规定的,这样⼦会出现错误。
1、可以同时指定第⼀维和第⼆维的长度;
2、可以只指定第⼆维的长度;
3、不可以只指定第⼀维的长度;
4、不可以第⼀维和第⼆维的长度都不指定。
综上所述,⾄少指定第⼆维的长度。
原因:⼀维数组存放在⼀段连续的内存中,⼆维数组的维度是逻辑上的概念,⽽实际上,⼆维数组在内存中也是⼀段连续的空间,与⼀维数组相同。
(1)数组的寻址⽅式
在处理⼆维数组时,对于array[m][n]的数组,如果要取特定位置的值,⽐如array[i][j]处的值,编译器的寻址⽅式是
+ n * i + j
即每⾏有⼏个元素(列的数量)。
(2)的分布
在内存中的地址排列⽅式是按⾏排列的,第⼀⾏排列完之后再排列第⼆⾏,以此类推。因为,当给出数组的列数时,通过列数与⾏数的关系,对于这样⼀个数组,就能到特定的,从⽽到值
/
可以⽤⼆维数组名作为实参或者形参,在被调⽤函数中对形参数组定义时可以指定所有维数的⼤⼩,也可以省略第⼀维的⼤⼩说明,如:
1  void Func(int array[3][10]);
2
3    void Func(int array[][10]);
4
5⼆者都是合法⽽且等价,但是不能把第⼆维或者更⾼维的⼤⼩省略,如下⾯的定义是不合法的:
6
7    void Func(int array[][]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按⾏存放),⽽并不区分⾏和列,如果在形参中不说明列数,则系统⽆法决定应为多少⾏多少列,不能只指定⼀维⽽不指定第⼆维,下⾯写法是错误的:
1    void Func(int array[3][]);实参数组维数可以⼤于形参数组,例如实参数组定义为:
2
3    void Func(int array[3][10]);
4
5⽽形参数组定义为:
怎么定义二维数组c语言6
7    int array[5][10];
8
9这时形参数组只取实参数组的⼀部分,其余部分不起作⽤。
⼤家可以看到,将⼆维数组当作参数的时候,必须指明所有维数⼤⼩或者省略第⼀维的,但是不能省略第⼆维或者更⾼维的⼤⼩,这是由编译器原理限制的。
由于编译器在处理⼆维数组时,对于array[m][n]的数组,如果要取特定位置的值,⽐如array[i][j]处的值,编译器的寻址⽅式是
array + n * i + j
因为⼆维数组在内存中的地址排列⽅式是按⾏排列的,第⼀⾏排列完之后再排列第⼆⾏,以此类推。因为,当给出数组的列数时,通过列数与⾏数的关系,对于这样⼀个数组,就能到特定的地址,从⽽到值。
如果只给⾏⽽不给列数,那么对于上述的寻址⽅式,编译器便⽆法正确的⼯作,因此在写形参时,需要把⼆维数组的列数表⽰出来。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。