那么有了二维数组啊,我就可以在二维数组的基础上再去定义三维数组。 比方说啊,既然我们可以把二维数组看作 多个一维数组所组成的一个集合,那么, 三维数组也可以这样来看待。比方说,我先定义一个二维数组 a[3][4],然后,接下来呢, 我再定义一个二维数组 a[3][4] ,再定义一个,再定义一个, 再定义一个,定义了五个二维数组。 然后呢,我给这些二维数组都取上名字,第一个数组命名为 a[0], 第二个数组 a[1], 第三个数组 a[2], 第四个数组 a[3], 第五个数组 a[4]。 通过这种方式,其实我就完成了一个三维数组, int a[5][3][4] 的一个定义。也就是说我们就定义了一个 三维数组。那有的同学可能就困惑了, 说 a[3][4] 我很好理解啊,3 行 4 列的一个数组。那 a[5][3][4] 我怎么去理解呢? 也很好办,我们看一个图。 假设,这个立方体就对应着我们刚才所定义的这个三维数组。 这个立方体呢,它的高是 3 , 它的宽呢,是 4 , 它的深呢,是 5。 如果我们把 a[5][3][4] 这样一个数组看作这样一个立方体的话, 那么,这个立方体啊就可以被切成很多 ”片“ 。比方说像切豆腐一样,我就可以把第一块切下来。 那么这样一片呢,就对应了一个二维数组 a[3][4]。 也就是说啊,对于一个三维数组,我们可以这样来理解。 这第一维啊,表示了这个三维数组包含多少片。什么叫片呢? 这就是一片。然后呢,它的第二维说明了每一片里头包含 多少行,那么这个呢,就对应着二维数组里面的行数。 那么最后一个呢,是说每一行里头包含多少列。 啊,对应着这个 [4] . 。 这就是三维数组的一个含义。它的关键就在于,你完全可以把 这个定义为想象中很多片。所以说啊,对于一个这样的三维数组, 我们完全可以把它切成 很多片。比方说,看这个图。一下子我给它切成了五片。 那么每一片呢,都是一个三行四列的二维数组。 然后每一片呢,都有一个标识。第一片是 a[0], 第二片 a[1] ,第三片 a [2] ,第四片 a[3] , 第五片 a[4]。 那三维数组跟二维数组之间,是这样的一种关系。那么有了一个这样的数组以后, 我怎么在内存里头把三维数组给存下来呢? 那么有了刚才二维数组的存储方式, 同学们也就不难想象三维数组的存储方式了。比方说这样一个三维数组我就可以这样来把它存下来。 因为我可以切成二维数组,所以说我可以把每一个二维数组 都存放在一片区域里头。比方说,我们可以把这个二维数组,啊可以存放在这样的一个区域里头。 把第二个二维数组存放在这样的一个区域里头。 第三个二维数组呢,再存放在这样的一个区域里头。 第四个二维数组呢,存放在这个范围里,等等等等。啊,也就是说, 我把三维数组切成二维数组来存储。然后二维数组呢,我拉成一维数组来存储。 于是在内存里头,无论你是一维数组,二维数组,三维数组,全部被拉成一条线 来存储。啊, 这就是它的存储方式。 那么了解了三维数组之后,有的同学可能就要问了,我能不能定义四维数组啊? 当然可以。你可以定义四维,五维, n 维数组,都可以。但是,你要知道, 定义维度更高的数组那一类的这个数组到底是怎样构成的将会更难以想象。 于是,它会严重的影响程序的可读性。所以说, 除非在非常特殊的情况下,真的不要去企图定义一个三维以上的数组。 啊,因为它非常的难以想象从而写的程序难以被别人读懂。而且,写这样的程序, 本身就是一个非常容易犯错误的过程。所以说, 至少在这个课程,我们不要去定义三维以上的数组。 而且,就算三维数组,在这个课程也要尽可能少的去使用。 因为我们的目的是要写出更有生命力的程序。