8.2 二维数组的索引
在逻辑上二维数组的是由多个一维数组组成的。因此二维数组的第一次索引会拿到某一行的一维数组,再次索引才能的获取到这一行内部的数据。
二维数组获取第 m 行数据的语法:
二维数组名[行整数表达式m]
示例1
// filename: 2d_array_index.c
#include <stdio.h>
int main(int argc, char *argv[]) {
int arr2d_1[2][3] = {{1, 2, 3}, {4, 5, 6}};
int *line1 = arr2d_1[0]; // line1 指向第一行一维数组的起始地址
int *line2 = arr2d_1[1]; // line2 指向第二行一维数组的起始地址
printf("*line1:%d\n", *line1);
printf("*line2:%d\n", *line2);
return 0;
}
运行结果如下:
weimingze@mzstudio:~$ gcc -o 2d_array_index 2d_array_index.c
weimingze@mzstudio:~$ ./2d_array_index
*line1:1
*line2:4
有上面的运行结果可知,arr2d_1[0] 为第一行数组,arr2d_1[1]是第二行数组。如下图所示。
+-----+-----+-----+
| 1 | 2 | 3 | <-- 二维数组的第一行,即 arr2d_1[0]
+-----+-----+-----+
| 4 | 5 | 6 | <-- 二维数组的第一行,即 arr2d_1[1]
+-----+-----+-----+
上述示例中指针 line1 和 line2 分为指向如下的物理内存的位置,如下图所示:
| arr2d_1[0] | arr2d_1[1] |
----+-----+-----+-----+-----+-----+-----+----
... | 1 | 2 | 3 | 4 | 5 | 6 | ...
----+-----+-----+-----+-----+-----+-----+----
^ ^
| &arr2d_1 |
| &arr2d_1[0] | &arr2d_1[0]
| &arr2d_1[0][0] | &arr2d_1[1][0]
line1 line2
对于二维数组使用一个索引运算符([])实际得到的是一维数组,那么再次使用索引运算符就可以得到内部数据的引用了。
二维数组获取第 m 行,第 n 列 数据的语法
二维数组名[行整数表达式m][列整数表达式n]
示例2
使用两重 for 循环嵌套获取遍历二维数组内的全部数据
// filename: trival_2d_array.c
#include <stdio.h>
int main(int argc, char *argv[]) {
int arr2d_1[2][3] = {{1, 2, 3}, {4, 5, 6}};
int row, col;
for (row=0; row < sizeof(arr2d_1)/sizeof(arr2d_1[0]); row++) {
for (col=0; col < sizeof(arr2d_1[0])/sizeof(arr2d_1[0][0]); col++) {
printf("第%d行,第%d列的值为: %d\n", row+1, col+1, arr2d_1[row][col]);
}
}
return 0;
}
运行结果如下:
weimingze@mzstudio:~$ gcc -o trival_2d_array trival_2d_array.c
weimingze@mzstudio:~$ ./trival_2d_array
第1行,第1列的值为: 1
第1行,第2列的值为: 2
第1行,第3列的值为: 3
第2行,第1列的值为: 4
第2行,第2列的值为: 5
第2行,第3列的值为: 6
实验:
研究经典 2048 游戏中二维数组的算法,2048 游戏的官方网站是 https://2048game.com/。
如果你学过 Python 语言,可以下载我用 Python 语言写的 2048 游戏,并将其代码改写成 C 语言。
Python 2048 游戏下载地址: