怎样定义和引用二维数组
二维数组常称为矩阵。把二维数组写成行(row)和列(column)的排列形式,可以有助于形象地理解二维数组的逻辑结构。
一.怎样定义二维数组
其基本概念与方法与一维数组相似,如:
float pay[3][6];
以上定义了一个float型的二维数组
第一维有3个元素,第二维有6个元素。每一维的长度分别用一对括号起来
二维数组定义的一般形式为
类型说明符 数组名 [常量表达式] [常量表达式]
例如:
float a[3][4],b[5][10];
定义a为3×4(三行四列)的数组,b为5×10(5行10列)的数组,但是不能写成 float a[3,4],b[5,10];
C语言对二维数组采用这样的方式定义,使得二维数组可被看作一种特殊的一维数组;它的元素又是一个一维数组,例如,可以把a看作一个一维数组,它有三个元素: a[0], a[1], a[2];
每个元素又是包含4个元素的一维数组,如
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]看作3个一维数组的名字,上面的定义的二维数组可以理解为定义了三个一维数组,即相当于:
float a[0][4],a[1][4],a[2][4];
此处把a[0],a[1],a[2]看作一维数组名。
用矩阵形式(如3行4列)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,铬元素是连续存放的,不是二维的,是线性的。
C语言还允许使用多维数组,有了二维数组的基础,再掌握多维数组是不困难的,例如定义三维数组的方法如下:
float a[2][3][4];
二.怎样引用二维数组的元素
二维数组元素的表现形式为:
数组名 [下标] [下标]
例如,a[2][3] 表示a数组中序号为2的行中序号为3的元素。下标应是整形表达式,
如a[2-1][22-1]。~~不要写成 a[2,3], a[2-1,22-1]形式。~~
数组元素可以出现在表达式中,也可以被赋值,例如:
b[1][2]= a[2][3]/2;
注意,在引用数组元素时,下标值应在已定义的数组大小的范围内。在这个问题上常出现错误,例如:
int a[3][4]; //定义a为3X4的二维数组
...
a[3][4]=3; //不存在a[3][4]元素
按以上定义,数组a可用的“行下标”的范围为 0~2,“列下标”的范围为 0~3.
用a[3][4] 表示元素显然超过了数组的范围。
大家严格区分在**定义数组a[3][4]和引用元素a[3][4]**的区别。
前者用来定义a[3][4]来定义数组的维数和各维的大小
后者a[3][4]中的3和4是数组元素的下标值,a[3][4]代表行序号为3,列序号为4的元素(行序号和列序号均从0起算)。
三.二维数组的初始化
可以用“初始化列表”对二维数组初始化。
(1).分行给二维数组赋初值。例如
ina a[3][4] = { (1,2,3,4),(5,6,7,8),(9,10,11,12)};
这种赋值方法比较直观,把第一个花括号内的数据给第一行的元素,第二个花括号内的数据赋给第二行的元素…即按行赋初值。
(2).可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序给各元素赋初值。例如:
int a[3][4]={ 1,2,3,4,5,6,7,8,9,10,11,12};
效果与前相同,但以第二种方法为好,一行对一行,界限清楚。用第(2)种方法如果数据多,则会写成一大片,容易疏漏,也不易检查。
(3).可以对部分元素赋初值,例如:
int a[3][4] = { { 1},{ 5},{ 9}};
它的作用是只对各行第一列(即序号为0的列)的元素赋初值,其余元素值自动为0,赋初值后各组元素为:
1 0 0 0
5 0 0 0
9 0 0 0
也可以对各行中的某一元素赋初值,例如:
int a[3][4]={ { 1},{ 0,6},{ 0,0,11}};
初始化后的数组元素为:
1 0 0 0 0
0 6 0 0 0
0 0 0 11 0
这种方法对非0元素少时比较方便,不必将所有的0都写出来,只需输入少量数据。
也可以只对某几行元素赋初值:
int a[3][4] ={ { 1},{ 5,6}};
数组元素为:
1 0 0 0
5 6 0 0
0 0 0 0
0 0 0 0
第三行不赋初值
也可以对第二行不赋初值,例如:
int a[3][4] ={ { 1},{ },{ 9}};
(4).如果对全部元素都赋初值(即提供全部初始化数据),则定义数组时对第一维的长度可以不指定,但第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维的长度。数组一共有12个元素,每行4列,显然可以确定行数为3。
在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值。例如:
int a[][4] = { { 0,0,3},{ },{ 0,10}};
这样的写法,能通知编译系统;数组共有3行。数组各元素为:
0 0 3 0
0 0 0 0
0 10 0 0
从本文的介绍可以看出:
C语言在定义数组和表示数组元素时采用a[][]这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不容易出错。