可以将多维数组的一部分看做子数组。比如说,二维数组的每一行都可以当做一维数组。这种行为会对我们用指针处理多维数组有所影响。
为了说明这种行为,我们创建一个二维数组并初始化,如下所示:
然后打印元素的地址和值:
输出如下所示:
数组按行–列顺序存储,也就是说,将第一行按顺序存入内存,后面紧接着第二行。内存分配如下图所示。
我们可以声明一个指针处理这个数组,如下所示:
(*pmatrix)
表达式声明了一个数组指针,上面的整条声明语句将pmatrix
定义为一个指向二维数组的指针,该二维数组的元素类型是整数,每行有5个元素。如果我们把括号去掉就声明了5个元素的数组,数组元素的类型是整数指针。如果声明的列数不是5,用该指针访问数组的结果则是不可预期的。
如果要用指针表示法访问第二个元素(就是2),下面的代码看似合理:
但输出却是:
matrix+1
返回的地址不是从数组开头偏移了4,而是偏移了第一行的长度,20字节。用matrix
本身返回数组第一个元素的地址,二维数组是数组的数组,所以我们得到是一个拥有5个元素的整数数组的地址,它的长度是20。我们可以用下面的语句验证这一点,它会打印出20:
要访问数组的第二个元素,需要给数组的第一行加上1,像这样:*(matrix[0] + 1)
。表达式matrix[0]
返回数组第一行第一个元素的地址,这个地址是一个整数数组的地址,于是,给它加1实际加上的是一个整数的长度,得到的是第二个元素。输出结果是104和2。
我们可以用图文的形式来说明数组,如图4-11所示。
上图可以解释二维数组表示法。