38 //数组指针example 1
39 int a[2][3] = {1,2,3,4,5,6};
40 int i,j;
41 int *p = *a;
42 int (*q)[3] = a; //此处a和q的根本区别就是a一个常量,q是一个整形指针,
43
44 printf("%p %p \n",a,a+1);
45 printf("%p %p \n",q,q+1);
46 for(i = 0; i < 2; i++)
47 {
48 for(j = 0; j < 3; j++)
49 {
50 printf("%p - > %d\n",*(a+i)+j,*(*(a+i) +j));
51 }
52 printf("\n");
53 }
解释:
1)第41行,int *p = a,是因为a是行指针,由于 (a+0) = a,且p是列指针,通过a就将行指针转换为了列指针,这样在列指针之间就可以相互赋值了,不会报从不兼容的指针类型赋值的错误
2)第42行,由于a是该二维数组的起始地址,int (q)[3] = a的意思是将二维数组的起始地址a赋给数组指针p,故整型指针p就指向了二维数组a的起始地址。故此时a+1的地址和p+1的地址是相同的
3)第50行,(a+i)+j是获取第i行第j列的地址,((a+i) +j)是取出第i行第j列的元素。