二维数组
二维数组可以存储具有二维关系的相同类型大量数据。二维数组在使用时需要两个下标才能确定数组的元素,其定义的一般形式如下:
数据类型说明符 数组名[整型表达式][整型表达式];
(1) 数据类型说明符与数组名的定义与使用方式与一维数组类似。
(2) 数组名后面的两个方括号中,第一个方括号说明二维数组的行数,第二个方括号说明二维数组的列数。
(3) 二维数组的下标范围确定与一维数组类似,行下标和列下标起始都是0,最大下标是分别是行数减1和列数减1。
例如:
int a[3][2];
定义的数组a是一个3行2列的int型二维数组,一共存放6个元素。二维数组的逻辑结构示意图如图6-3所示,该数组行下标范围是0到2,列下标范围是0到1。
二维数组在内存中的实际存放时,数组元素的排列是按照“行优先原则”存放的,即在内存中先按顺序存放第0行的元素,接着再存放第1行的元素,这样依次存放:
二维数组的引用
二维数组的引用
二维数组同样只能引用数组的元素而不能一次引用整个数组和全部元素。引用二维数组元素的一般形式如下:
数组名[下标][下标]
说明:引用二维数组元素时,下标的数据类型、取值范围的规则与一维数组相同。需要注意的是引用一个二维数组元素需要同时使用行和列两个下标。
例:从键盘输入2行3列的整型矩阵a,将其转置后存入3行2列的矩阵b,输出矩阵b。
思路分析:矩阵的转置操作是将存放矩阵的二维数组中元素的行和列进行互换,因此数组a的行数等于b的列数,a的列数等于b的行数。在对二维数组进行操作时,通常使用循环的双重嵌套来处理数组的元素。
参考代码:
#include <stdio.h>
int main()
{
int a[][], b[][];
int i, j;
printf("Input matrix a:\n");
for(i=; i<; i++)
{
for(j=; j<; j++)
{
scanf("%d", &a[i][j]); //输入数组a的一个元素
}
}
for(i=; i<; i++)
{
for(j=; j<; j++)
{
b[j][i] = a[i][j];
}
}
printf("Matrix b:\n");
for(i=; i<; i++)
{
for(j=; j<; j++)
{
printf("%5d ", b[i][j]); //输出数组b的一个元素
}
printf("\n");
}
return ;
}
输出结果:
二维数组的初始化
二维数组进行初始化可以有以下几种形式。
(1) 分行对二维数组的全部元素进行初始化。例如:
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
(2) 也可以将初始化的所有数据写在一个花括号中,按数组元素在内存中的排列顺序进行初始化。例如上面的初始化也可以写成如下形式。
int a[3][2] = {1, 2, 3, 4, 5, 6};
(3) 可以对二维数组的部分元素进行初始化。例如:
int a[3][2] = {{1}, {0, 3}, {5}};
(4) 对二维数组的全部元素进行初始化时,可以省略数组第一维的长度,但是第2维的长度不能省略。例如:
int a[][2] = {1, 2, 3, 4, 5, 6};
例:给定一个3行4列的整型数组a,编写程序找出其中最小的元素的值,以及它所在的位置。
例如:a[3][4] = {{1, 2, 3, 4}, {9, 8, 10, 2}, {-10, 6, 5, 2}};
思路分析:在二维数组中找最小值的方法与在一维数组是相似的,同样也是先假设数组的第1个元素a[0][0]的值最小,然后依次把二维数组中的所有元素与它进行比较,如果找到比当前最小值还小的元素,则更新最小值和相应的下标值。对二维数组进行操作时,注意使用循环嵌套。
参考代码:
#include <stdio.h>
int main()
{
int a[][] = {{1, 2, 3, 4}, {9, 8, 10, 2}, {-10, 6, 5, 2}};
int i, j, row, col, min; //min, row, col分别表示最小值及下标
row = col = ; //设a[0][0]为当前最小值
min = a[row][col];
for(i=; i<; i++)
{
for(j=; j<; j++)
{
if(a[i][j]<min) //找到比min小的元素
{
row = i;
col = j;
min = a[row][col];
}
}
}
printf("min=%d,row=%d,col=%d\n", min, row, col);
return ;
}
输出结果: