如下代码
#include <stdio.h>
int main(){
int a[3][2] = {0, 1, 2, 3, 4, 5};
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("a[%d][%d] = %d\t", i, j, a[i][j]);
printf("*(*(a + %d) + %d) = %d\n",i, j, *(*(a + i) + j));
}
}
return 0;
}
得到的结果就是都是一样的,遍历数组中的元素的值。这说明,数组的值其实可以痛过指针的方式去得到。
上次已经说过,a代表的就是数组的首元素的地址,那么*a就是取出首元素值的操作。但那是针对于一维数组而言的。
那么对于二维数组来说,又是不一样的。但是,我们可以根据一维数组来推导二维数组。
二维数组,就是在一维数组的每一个格子里面,再细分为一个数组。
于是,原本一维数组的*a取的是一维数组的值,那么在二维数组中,它取的就是首行的值,也就是a[0][],这并不是某一个元素的值,而是一组元素,所以,取出来的并不是值,而仍然是地址,一个小数组的首元素地址。那么,我们如果想要取下一行的数组,就只要在a上+1,也就是*(a+1)。第i行就是*(a+i)。
那么,接下来的,就是取列已经取到了一维数组的首地址,那么接下来取出值就很简单了,依次类推,就是*(*a),这取的就是第一行的第一列,也就是a[0][0]。那么,要想取后面的,只要增加列就行了即*(*a+j)。那么,要想取出a[i][j]的值,就只要*(*(a+i)+j)就行了,如上面的代码。
这就是二维数组和指针的关系。