实际应用中有些数据需要依赖两个因素才能唯一地确定。例如有3个学生,每个学生有5门课程的成绩,显然,成绩数据是一个二维表,如下表所示
如果想表示第3个学生第4门课程的成绩,就需要指出学生的序号和课程的序号两个因素,在数学上以S3,4表示。在C/C++中要用S[2][3]来表示(注意下标从0开始),它代表数据90
具有两个下标的数组称为二维数组
1.定义二维数组
定义二维数组的一般形式为:
数据类型 数组名[常量表达式][常量表达式]
第一个常量表达式表示行的数目,第二个常量表达式表示列的数目
如:
int a[3][4]; //定义a为3行4列的二维数组
float b[2][5];
int a[3][4]; //定义a为3行4列的二维数组
对数组a,一共有3×4=12个元素,其中第0行的4个元素是:a[0][0]、a[0][1]、a[0][2]、a[0][3]
这12个元素在内存中的存储顺序是:按行存放,即在内存中先按顺序存放第0行的4个元素,然后是第1行的4个元素,最后是第2行的4个元素。如右图所示
int a[3][4]; //定义a为3行4列的二维数组
而且这12个元素在内存中也是连续存放的,如果a[0][0]的地址是2000(十进制),则a[0][1]的地址是2004,…,最后一个元素a[2][3]的地址是2044。如下图所示:
2.引用二维数组的元素
二维数组元素的引用形式为:
数组名[行下标][列下标]
如:a[2][3] = b[3][2] + 1;
3.二维数组的初始化
二维数组的初始化有两类方法:分行初始方法和按元素排列顺序初始化方法
1)分行初始方法:在花括号内再以花括号的形式将每行元素列举出来,有3种形式
①全部元素初始化。例如:inta[2][3]={{1,2,3},{4,5,6}}:
②部分元素初始化。例如:int a[2][3]={{1,2},{4}; //a[0][2]、a[1][1]、a[1][2]由编译器自动赋值为0
③初始化时第一维长度省略。例如:inta[ ][3]={{1},{4,5}};
第一维下标是根据最外围花括号内花括号的对数来确定的,比如上述例子等效于:
int a[2][3]={{1},{4,5}};
注意:第二维的长度不能省略!
2)按元素排列顺序初始化方法:把所有元素按元素的排列顺序在花括号内列举出来,同样也有3种形式
①全部元素初始化。例如:int a[2][3]={1,2,3,4,5,6};
②部分元素初始化。例如:int a[2][3]={1,2,4};
③初始化时第一维长度省略。例如:int a[ ][3]={1,2,3,4,5,6,7,8};
花括号内8个数,前3个是第0行,中间3个是第1行,最后2个是第2行,编译器对第2行的最后1个元素a[2][2]自动赋值为0。这样该数组一共有3行,即上述语句等效于:int a[3][3]={1,2,3,4,5,6,7,8};
同样要注意:第二维的长度不能省略!
4.用循环处理二维数组
跟一维数组一样,二维数组的一个优势是可以通过循环对所有元素进行统一的处理。这种统一处理有时称为遍历:就是访问每个元素一次且仅一次,不能重复也不能由遗漏。遍历二维数组需要采用二重循环。例如,输出二维数组的每个元素,就需要访问每个元素一次且仅一次
假设有一个3×4的二维数组,则遍历该数组要用到下面的2重循环:
int i, j; //循环变量
for(i=0;i<3;i++){ //遍历第0行~第2行
for(j=0;j<4;j++){ //遍历每行的第0列~第3列元素
//在此处访问a[i][j],保证能访问每个元素一次且仅一次
}
}