前面介绍了一维数组。在实际问题中有些数据信息是二维的或者多维的。多维数组元素有多个下标,以标识它在数组中的位置。本节只介绍二维数组,多维数组可由二维数组类推而得到。
声明二维数组
二维数组的声明与一维数组类似,只是需要给出两对方括号,声明二维数组的语法为:
类型说明符 数组名[][];
例如:
int a[3][2];
score[2+1]1+1];
其中,声明语句的第一个方括号可以称为行数组,第二个方括号可以称为列数组。
二维数组的初始化
同一维数组类似,二维数组在使用前也要进行初始化。初始化也分为静态初始化和动态赋值。
① 静态初始化
静态初始化是在数组声明时,对声明的数组元素赋初值的过程。
例如:
int array[][] = {{3,-9,6},{8,0,1},{11,9,8}};
声明并初始化数组array,它有3个元素,每个元素又都是有3个元素的一维数组。外层大括号对里面的元素是行数组的元素,因为行数组元素是一维数组,因此每个行数组元素也用大括号对包括起来,里面的元素是列数组的元素。
另外,用指定初值的方式对数组进行初始化时,列数组元素的个数可以不同。
例如:
int array[][] = {{3,6},{8,0,1},{11,9,8}};
此时,第一个列数组的元素个数是2,第二个和第三个列数组的元素个数是3个。
② 动态赋值
二维数组的动态赋值和一维数组的动态赋值操作相同。
●先声明二维数组
例如:
int b[1][2];
int a[3][2];
●动态赋值
a[0][0] = 3;
a[0][1] = 6;
b[0][0] = 5;
b[1][0] = 10;
b[2][0] = 15;
二维数组元素的访问
二维数组的元素通过两个下标进行访问,分别是行数组下标和列数组下标,例如:对于二维数组a,可通过a[i][j]进行访问,其中i和j为数组a的下标。
例如:
#include <stdio.h>
int main()
{
int a[3][3] = {{3,-9,6},{8,0,1},{11,9,8}};
int i,j;
for( i = 0; i < 3; i++ )
{
for(j=0; j<3;j++)
printf("a[%d][%d] 数组元素的值为: %d;\n",i,j,a[i][j]);
}
}
在遍历数组的外层for循环中,循环条件为a数组第1维的长度,在内层for循环中,循环条件为a数组第2维的长度。
二维数组的存储结构
前面array数组的存储结构如下图所示:

下面通过一个完整的示例,演示如何声明一个二维数组,赋值并输出。
例【1】二维数组练习
编程要求:使用一个二维数组,存储5名同学的语文成绩和数学成绩,成绩由用户录入,最后输出这5名同学的语文成绩和数学成绩。
程序清单 sample.c
#include <stdio.h>
void main()
{
/**
* 声明grade数组
* 数组第1维是学生元素
* 数组第2维是成绩元素
*/
float grade[5][2];
//i,j为循环变量
int i;
//循环接收用户输入的学生成绩
for( i=0; i < 5; i++ )
{
printf("请输入 %d 个学生的语文成绩: ",i+1);
scanf("%f",&grade[i][0]);
printf("请输入 %d 个学生的数学成绩: ",i+1);
scanf("%f",&grade[i][1]);
printf("\n");
}
printf("*****学生成绩******");
//输出学生成绩
for( i=0; i < 5; i++ )
{
printf("语文成绩:%.2f 数学成绩:%.2f \n",grade[i][0],grade[i][1]);
}
}
程序功能主要是演示二维数组声明、初始化、动态赋值、输出数组元素的使用方法。
程序声明一个二维数组grade,其中第1维有5个元素,存储5名学生的信息,第2维数组有2个元素,分别存储学生的语文成绩和数学成绩。程序通过循环依次获取用户输入的5位学生的语文成绩和数学成绩,并存储到二维数组中。最后,循环输出每位学生的语文成绩和数学成绩。