二维数组本质
二维数组本质就是一维数组,只不过**形式是二维**,类似矩阵,使用二维数组表示会更加形象。
二维数组实例
float rain[5][12]; //内含5个数组元素的数组,每个数组元素内含12个float类型的元素,形如5行12列的表格
形式如表1-1所示:
第一行 | rain[0][0] | rain[0][1] | rain[0][2] | rain[0][3] | rain[0][4] | rain[0][5] | rain[0][6] | rain[0][7] | rain[0][8] | rain[0][9] | rain[0][10] | rain[0][11] |
第二行 | rain[1][0] | rain[1][1] | rain[1][2] | rain[1][3] | rain[1][4] | rain[1][5] | rain[1][6] | rain[1][7] | rain[1][8] | rain[1][9] | rain[1][10] | rain[1][11] |
第三行 | rain[2][0] | rain[2][1] | rain[2][2] | rain[2][3] | rain[2][4] | rain[2][5] | rain[2][6] | rain[2][7] | rain[2][8] | rain[2][9] | rain[2][10] | rain[2][11] |
第四行 | rain[3][0] | rain[3][1] | rain[3][2] | rain[3][3] | rain[3][4] | rain[3][5] | rain[3][6] | rain[3][7] | rain[3][8] | rain[3][9] | rain[3][10] | rain[3][11] |
第五行 | rain[4][0] | rain[4][1] | rain[4][2] | rain[4][3] | rain[4][4] | rain[4][5] | rain[4][6] | rain[4][7] | rain[4][8] | rain[4][9] | rain[4][10] | rain[4][11] |
注:表1-1中每个单元格代表一个元素
示例代码如下:
/***********************************
* @file rain.c
* @author bijiaqin
* @date 2019年12月1日
* @note 二维数组示例,计算每年降水量、平均降水量和五年中每月的平均降水量
* *********************************
*/
#include "stdio.h"
#include "stdint.h"
#define MONTHS 12
#define YEARS 5
int main(void)
{
const float rain[YEARS][MONTHS] = {
{4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
{9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
{7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
{7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}
};
int year, month;
float subtot, total;
for(year = 0, total = 0; year < YEARS; year ++)
{
for(month = 0, subtot = 0; month < MONTHS; month ++)
{
subtot += rain[year][month]; /**< 每一年各月的降水量总和 */
}
printf("%5d %12.1f\n", 2010 + year, subtot);
total += subtot; /*< 5年总降水量 */
}
printf("\n");
printf("The yearly average is %.1f inches. \n\n", total / subtot);
printf("Monthly avergaes: \n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
for(month = 0; month < MONTHS; month ++)
{
for(year = 0; year < YEARS; year ++)
{
subtot += rain[year][month]; /**< 每年总降水量 */
}
printf("%4.1f", subtot / YEARS);
}
printf("\n");
return 0;
}
处理二维数组常用方法
嵌套循环,如示例代码连续两个两层for循环用来计算总降水量和每个月的总降水量。
关于初始化
二维数组初始化通常习惯用**花括号套花括号**,中间用','隔开,如上面代码所示,当然也可以省略里面的花括号,只要保证元素个数正确、按行初始化即可,如:
const float rain[YEARS][MONTHS] = {
4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6,
8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3,
9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4,
7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2,
7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2,
};
有嵌套花括号时,可按照一维数组的初始化规范,某行数组初始化元素不足时其它位为0,不影响当前行其它数组元素;某行数组初始化元素越界则会出错,但同样不会影响其它行数组的初始化。
二维数组延申——多维数组
如三维数组
int triArrays[2][3][4] = {
{
{2, [1] = 8, 4}, /**< 第四个元素位初始化,则默认为0,第二个元素使用下标进行初始化
{1, 2, 3, 4},
{1, 2, 3, 4}
},
{
{2, 3, 4, 5},
{2, 3, 4, 5},
{2, 3, 4, 5}
}
};
多维数组处理方法:
二维数组采用两层嵌套循环,三层采用三层循环,以此类推。