二维数组
定义
定义二维数组的方法跟一位数组相似,使用方括号指定每个维度的元素个数:
类型 数组名 [常量表达式] [常量表达式]
int a[6][6]; // 6 * 6,6 行 6 列
char b[4][5]; // 4 * 5,4 行 5 列
double c[6][3]; // 6 * 3,6 行 3 列
访问
- 数组名 [下标] [下标]
a[0][0]; // 访问 a 数组中第 1 行第 1 列的元素
b[1][3]; // 访问 b 数组中第 2 行第 4 列的元素
c[3][3]; // 访问 c 数组中第 4 行第 4 列的元素
注意:使用下标访问数组中的元素,同样要注意访问越界的问题
比如 int a [3] [4],其“行下标”的取值范围是 0~2,“列下标”的取值范围是 0~3,超出任何一个下标的访问都会造成越界。
二维数组的遍历
for(i=0;i<3;i++){
for(j=0;j<5;j++){
a[i][j]=i*j;
}
}
- a[i][j]是一个int,表示第i行第j列上的单元
初始化
#include <stdio.h>
int main()
{
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
结果如下:
-
每行一个{ },逗号分隔,最后的逗号可以存在,如果省略,表示补零。
-
由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内:
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
- 为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来:
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
- 二维数组也可以仅对部分元素赋初值:
int a[3][4] = {{1}, {5}, {9}};
这样写是只对各行的第 1 列元素赋初值,其余元素初始化为 0。
- 如果希望整个二维数组初始化为 0,那么直接在大括号里写一个 0 即可:
int a[3][4] = {0};
- C99 同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为 0:
int a[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3};
- 二维数组的初始化,列数是必须给出的,行数可以由编译器来数:
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
列子:成绩的录入
#include <stdio.h>
int main()
{
int a[4][5] = {
{80,92,85,86,99},
{78,65,89,70,99},
{67,78,76,89,99},
{88,68,98,90,99}
};
int i,j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
printf(" %d",a[i][j]);
}
printf("\n");
}
return 0;
}
结果如下:
矩阵的转置:
#include <stdio.h>
int main()
{
int a[4][5] = {
{80,92,85,86,99},
{78,65,89,70,99},
{67,78,76,89,99},
{88,68,98,90,99}
};
int i,j;
for(i = 0;i < 5;i++)
{
for(j = 0;j < 4;j++)
{
printf(" %d",a[j][i]);
}
printf("\n");
}
return 0;
}
结果如下: