6.2 二维数组
6.2.1 二维数组的一般形式
前面讲解一维数组是带着一对中括号的,也就是说带一个下标,现在讲讲二维数组。显然,二维数组带两对中括号,也就是说带两个下标。看看二维数组定义的一般形式:

例如:

上面这行代码的含义:定义a为3行4列的数组,这种按几行几列的方式来理解二维数组的方式最朴素,也最容易理解。

图6.4 将二维数组理解成含有多个元素的一维数组
也可以这样理解,把二维数组看成是一种特殊的一维数组,也就是说它的元素又是一个一维数组。例如针对a[3][4]这个二维数组,可以把a看成是一个一维数组,这个一维数组有三个元素,即a[0]、a[1]、a[2],每个元素(都看成是一个一维数组名)又是一个包含4个元素的一维数组,这个感觉可以参考图6.4。
所以,“floata[3][4];”就相当于定义了12个元素(3行4列),第一维下标能引用的范围是0~2,第二维下标能引用的范围是0~3,所以整个二维数组能够引用的元素如下,共12个元素:

讲解一维数组时,感受可以参考图6.1,此时讲解二维数组时,感受可以参考图6.5。

图6.5 int a[3][4]数组包含的元素示意图,注意第一维下标0~2,第二维下标0~3
在C语言中,二维数组的元素存放顺序是:按行存放。即在内存中先顺序存放第一行元素,再存放第二行元素,以此类推,所以,float a[3][4]这个二维数组在内存中存放数据看起来应该如图6.6所示。

图6.6 二维数组在内存中按行存放
有了对二维数组的理解,三维数组甚至多维数组就好理解了。例如,定义一个三维数组:

多维数组在内存中的排列顺序:第一维下标变化最慢,最右边维度的下标变化最快,例如上面这个三维数组,在内存中的排列顺序应该是这样:

在实际工作中,一维和二维数组常用,三维和多维数组用的都比较少。