二维数组定义的一般形式为:
类型说明符 数组名[常量表达式 ][常量表达式]
例如:float a[3][4],b[5][10];
是定义a为3行4列的数组,b为5行10列的数组。
注意不可以写成float a[3,4],b[5,10];
,这种写法是错误的。
C语言对二维数组的定义方式使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个数组。
例如可以把a看作一个一维数组,它有3个元素:a[0],a[1],a[2]
这3个元素每一个元素又是一个包含四个元素的一维数组
a[0]----a[0][0] a[0][1] a[0][2] a[0][3]
a[1]----a[1][0] a[1][1] a[1][2] a[1][3]
a[2]----a[2][0] a[2][1] a[2][2] a[2][3]
把a[0],a[1],a[2]看作是一维数组的数组名,上面定义的二维数组就可以理解为定义了三个一维数组,相当于float a[0][4],a[1][4],a[2][4];
C语言的这种处理方法在数组初始化和用指针表示时更方便。
C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。
用矩阵形式(如3行4列)表示二维数组是逻辑上的概念,能形象的表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
2.引用二维数组的元素
二维数组元素的表示形式:
数组名[下标][下标]
例如,a[2][3]表示a数组中序号为2的行序号为3的列的元素。下标应是整型表达式。
数组元素可以出现在表达式中,也可以被赋值,例如b[1][2]=a[2][3]/2;
注意:在引用数组元素时,下标值应该在已定义的数组大小的范围内。
例如:int a[3][4];
按照以上的定义,数组a可用的“行下标”的范围为0~2,
“列下标”的范围为0~3.
要严格注意在定义数组时用的a[3][4]和引用元素时的a[3][4]的区别。定义数组用的a[3][4]是来定义数组的维数和各维的大小,引用元素时用的a[3][4]中的3和4是数组元素的下标值,a[3][4]代表行序号为3,列序号为4的元素,要注意行序号和列序号都从0算起。
3.二维数组的初始化
用“初始化列表”对二维数组初始化。
(1)分行给二维数组赋初值。例如
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋初值的方法比较直观,把第一个花括号中的数据赋给第1行的元素,第二个花括号中的数据赋给第2行的元素…即按行赋初值。
(2)可以将所有数据写在一个花括号中,按数组元素在内存中的排列顺序对各元素赋初值。例如
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值。例如
只对各行第一列的元素赋值,其余元素的值自动为0。
inta[3][4]={{1},{5},{9}};
1 0 0 0
5 0 0 0
9 0 0 0
对各行中的某一元素赋初值。这种方法对非0元素少时比较方便。
int a[3][4]={{1},{0,6},{0,0,11};
1 0 0 0
0 6 0 0
0 0 11 0
只对某几行的元素赋初值
int a[3][4]={{1},{{5,6}};
1 0 0 0
5 6 0 0
0 0 0 0
(4)如果对全部元素都赋初值,则定义数组时对第1维的长度可以不指定,但第2维的长度不能省。例如
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
与下面的定义等价
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
系统会根据数据的总个数和第2维的长度算出第1维的长度。
在定义时也可以只对部分元素赋初值而省略第1维的长度,但应该分行赋值。例如
int a[][4]={{0,0,3},{},{0,10}};
这样的写法,能通知编译系统,数组共有3行
0 0 3 0
0 0 0 0
0 10 0 0
C语言在定义数组和表示数组时采用a[][]这中两个方括号的方式,对数组初始化十分有用。