上次梳理了一维数组的与指针的原理以及它们的关系,我们再来看看二维数组。
当我们定义一个二维数组时,实际上占用的是内存中连续的线性空间。
倘若我们定义整形的二维数组:int b[2][3],实际上它在内存中占用连续6个整形元素的空间。而且是3个元素一组,形成2组一维数组。
这句话的意思是,二维数组b[2][3]可以看作包含两个元素的一维数组,而每个元素又恰好包含3个整形的元素,恰好也是一维数组。
根据这个原理,我们可以 将二维数组看作是嵌套的一维数组,即分作外层一维数组与内层一维数组。
同理,既然是一维数组,就有内嵌的特殊指针。
外层的一维数组我们可以看作是b[2],它具有特殊的指针b,指针地址是一维数组b首个元素b[0]的地址,即&b[0],指针b存取着数组首个元素b[0]的地址,所以b == &b[0];
既然存在指针,当然可以进行指针运算,同一维数组,我们对指针b进行指针运算也是对指针b存取的地址进行更改,只是…指针b每+1,地址加多少位呢?我们定义的数组数据类型为整形,可我们这个“特殊”的外层一维数组每一元素占用地址不是一整形地址,而是3整形地址。即3*4 = 12 字节。
所以,当我们对b进行指针运算时,得出的地址是下一个包含3个整形元素的元素的地址,即外层一维数组下一个元素的地址。
说完了外层的一维数组,我们再来看内层的一维数组。