9. 多维数组

我们把二维数组及以上维度的数组称为多维数组

前面讲过了二维数组,二维数组可以认为是由多个相同长度的一维数组组合而成。这节课我们来讲解 三维数组以及更多维度的数组。

理解了二维数组,那理解三维数组、四维数组也就变得简单了。三维数组你可以认为是由多个相同长度的二维数组组合而成。同样四维数组你也可以认为是由多个相同长度的三维数组组合而成,以此类推。

三维数组在图片领域非常常用,比如一张彩色图片宽度为 w,高度为 h,由红绿蓝三种颜色组成,每一颜色用一个字节表示,那这个图片就可以用 unsigned char 类型的三维数组表示为 unsigned char pic[w][h][3];

三维数组声明的语法:

数据类型 数组名[页整数表达式p][行整数表达式m][列整数表达式n] = {...}, ...;

四维数组声明的语法:

数据类型 数组名[本整数表达式b][页整数表达式p][行整数表达式m][列整数表达式n] = {...}, ...;

语法说明:

  1. 多维数组的语法和二维数组的语法规则相同。
  2. 多维数组最高维度的整数表达式可以省略不写,不写则必须由初始化列表推导得到。
  3. 多维数组的索引规则同二维数组的索引规则。

示例:

// filename: 3d_array.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    // 声明一个 4 页 2 行 3 列的三维数组并初始化。
    int arr3d[4][2][3] = {
        {{111, 112, 113}, {121, 122, 123}},
        {{211, 212, 213}, {221, 222, 223}},
        {{311, 312, 313}, {321, 322, 323}},
        {{411, 412, 413}, {421, 422, 423}}
    };
    printf("sizeof(arr3d):%ld\n", sizeof(arr3d));
    return 0;
}

运行结果如下:

weimingze@mzstudio:~$ gcc -o 3d_array 3d_array.c
weimingze@mzstudio:~$ ./3d_array
sizeof(arr3d):96

上述三维数组的逻辑结构如下:

       +---+---+---+
      /411 412 413/|
     +---+---+---+ |
    /311 312 313/| +
   +---+---+---+ |/
 / 211 212 213/| +
+---+---+---+  |/
|111 112 113|  +
|121 122 123| /
+---+---+---+

其物理存储结构在内存中依旧是连续存储(相当于多个二维数组依次排列)。

      ________ 第一页 ______   ________ 第二页 ______   ___
     /                     \ /                     \ /
----+---+---+---+---+---+---+---+---+---+---+---+---+----
... |111 112 113|121 122 123|211 212 213|221 222 223| ...
----+---+---+---+---+---+---+---+---+---+---+---+---+----
    |第一页第一行 |第一页第二行 |第二页第一行 |第二页第二行 |

基于上述的物理存储结构。通常我们使用一级指针就可以引用所有的数据元素。

实验:

自己定义不同长度的三维数组,使用取地址的方式打印行、列、页的地址,研究三维数组在计算机内存中的结构。