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 游戏下载地址:

https://gitee.com/weimz/py2048