夜雨聆风学习资料网

ARTICLE · 1261979

第2期|像Excel表格一样存数据:二维数组

第2期|像Excel表格一样存数据:二维数组

第2期|像Excel表格一样存数据:二维数组

一、什么时候需要二维数组?

上一期我们用一维数组存了1000个同学的成绩。可如果校长再问一句:“每个班有6个小组,每个小组3个同学,把工资/成绩按分队分队员存起来”,一个下标就不够用了——你既需要知道是哪一队,又需要知道是队里第几个人。

这时就要请出二维数组。它需要两个下标才能唯一确定一个元素,逻辑上就像一张带行号和列号的表格。

二、二维数组的定义

类型符数组名[常量表达式][常量表达式];

float a[3][4];// 3行4列,共12个元素

可以把 a 想象成一个“特殊的一维数组”:它有3个元素 a[0]、a[1]、a[2],而每个元素本身又是一个含4个元素的一维数组。这种“数组的数组”的理解方式,对后面学指针非常有帮助。

图3二维数组:逻辑上是表格,内存里按行连续存放

关键结论:二维数组在内存里是“一排”连续的格子,按行依次放:先放第0行4个,再放第1行4个,最后第2行4个,并不是真的一张二维表。

三、二维数组的初始化

考试常考下面这几种写法,一定要能看出它们等价于什么:

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

int a[ ][4] = {1,2,3,4,5,6,7,8,9,10,11,12};// 行数可省,列数不能省

易错点:定义二维数组时“行数可以省略,列数绝对不能省”——因为编译器要靠列数才能把这一长串数正确地分行。

四、经典例题1:矩阵转置

把一个2行3列的矩阵 a,行和列互换,存到3行2列的矩阵 b 里。核心只有一句话:把 a[i][j] 送到 b[j][i] 的位置。

图4矩阵转置:a[i][j] 与 b[j][i] 位置互换

int a[2][3] = {{1,2,3},{4,5,6}};

int b[3][2], i, j;

for (i = 0; i <= 1; i++)

for(j = 0; j <= 2; j++)

b[j][i]= a[i][j];// 关键的一行:行列下标互换

就这一行,把内外两层循环的下标“i和j”交换了位置,转置就完成了。

五、经典例题2:打擂台求最大值

有一个3×4的矩阵,找最大值,以及它所在的行号、列号。算法特别形象,叫“打擂台”:

先让 a[0][0] 站在台上当冠军(把它赋给 max);然后把矩阵里剩下的每个数都拉上来跟台上比,谁大谁就留在台上;所有人都比完后,留在台上的就是最大值。同时用 row、colum 两个变量记下冠军当前的位置。

int i, j, row = 0, colum = 0, max;

int a[3][4] = {{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};

max = a[0][0];

for (i = 0; i <= 2; i++)

for(j = 0; j <= 3; j++)

if(a[i][j] > max)

{

max= a[i][j];

row= i;

colum= j;

}

printf("max=%d\nrow=%d\ncolum=%d\n", max, row, colum);

解题模板:求最大值三件套——先假设第一个是最大值;再遍历全部元素逐个比;发现更大的就更新 max 和它的下标。最小值、行和、列和、对角线求和,都是这个模板的变体。

六、本期高频考点 & 重难点盘点

【高频考点】

1. 二维数组的行数、列数、总元素个数计算。

2. 初始化形式辨析:哪种写法等价于“每行第1列是1、5、9,其余是0”。

3. 矩阵转置的核心语句 b[j][i] = a[i][j]。

4. 嵌套 for 循环遍历二维数组、打擂台求最大值/最小值并记录行列号。

【重难点 & 易错点】

① 行列下标顺序写反:a[i][j] 中 i 是行、j 是列,写反结果就全错。

② 内存中按行存放,所以遍历二维数组时“外层循环行、内层循环列”效率最高。

③ int a[ ][4]={...}; 合法,但 int a[3][ ]={...}; 不合法。

④ 记录最大值时,max、row、colum 的初值都要设好,特别是 row 和 colum 一开始应该是 0(指向 a[0][0])。

下期预告:字符数组与字符串——'\0' 到底是什么?strcpy、strlen、strcmp 到底怎么用?统计单词个数那道经典题,我们下期见。

相关学习资料