一、问题
如何使⽤指针操作多维数组呢?
二、解答
从⼆维数组的⻆度来看,a 是⼆维数组名,a 代表整个⼆维数组的⾸地址,也是⼆维数组 0 ⾏的⾸地址,等于1000。a+1 代表第⼀⾏的⾸地址,等于1008。
如下图所示。 a[0] 是第⼀个⼀维数组的数组名和⾸地址,因此也为1000。*(a+0) 或 *a 是与 a[0] 等效的,它表示⼀维数组 a[0] 0 号元素的⾸地址,也为 1000。&a[0][0] 是⼆维数组a的0⾏0列元素⾸地址,同样是1000。因此,a,a[o],*(a+0),*a,&a[0][0]是相等的。
同理,a+1 是⼆维数组 1 ⾏的⾸地址,等于1008。a[1] 是第⼆个⼀维数组的数组名和⾸地址,因此也为 1008。&a[1][0] 是⼆维数组 a 的 1 ⾏ 0 列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i] ,*(a+i),&a[i][0] 是等同的。
此外,&a[i] 和 a[i] 也是等同的。因为在⼆维数组中不能把 &a[i] 理解为元素 a[i] 的地址, 不存在元素 a[i] 。C语⾔规定,它是⼀种地址计算⽅法,表示数组 a 第 i ⾏⾸地址。由此可以得出:a[i] ,&a[i] ,*(a+i) 和 a+i 也都是等同的。
另外,a[]也可以看成是 a[0]+0,是⼀维数组 a[0] 的 0 号元素的⾸地址,⽽ a[0]+1 则是 a[0] 的 1 号元素⾸地址,由此可得出 a[i]+j是⼀维数组 a[i] 的 j 号元素⾸地址,它等于&a[i][j] 。
int main()
{
int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
printf("%d", a);
printf("%d", *a);
printf("%d", a[0]);
printf("%d", &a[0]);
printf("%d", &a[0][0]);
printf("%d", a + 1);
printf("%d", *(a + 1));
printf("%d", a[1]);
printf("%d", &a[1]);
printf("%d\n", &a[1][0]);
printf("%d", a + 2);
printf("%d", *(a + 2));
printf("%d", a[2]);
printf("%d", &a[2]);
printf("%d\n", &a[2][0]);
printf("%d", a[1] + 1);
printf("%d\n", *((a + 1) + 1));
printf("%d,%d\n", *(a[1] + 1), *((a + 1) + 1));
}
由 a[i]=*(a+i) 得a[i]+j=*(a+i)+j。由于 *(a+i)+j 是⼆维数组 a 的 i ⾏ j 列元素的⾸地址,所以,该元素的值等于 *(*(a+i)+j)。
指针操作⼆维数组的基本操作实例程序如下。
三、总结
这⾥仅是⼀级指针对⼆维数组的操作,但是我们⼀定要透彻地进⾏理解,因为⼆级指针操作⼆维数组时要以此为基础。