#include <stdio.h>
void main()
{
int buf[2][3] = { {1,2,3},{4,5,6} };
int(*p)[3]; //定义了一个指针,指向int [3]这种数据类型。指针p即为指向二维数组的指针
p = buf;//p指向了二维数组中的第0行
//p++; //指向了第1行
printf("%d\n", sizeof(p));//输出4,表明p是一个指针
printf("%d,%d\n", p, p + 1);//输出14614236,14614248 12=3*4 位移了1 * sizeof(int [3]) =12
printf("p+1=%d\n", p + 1);//输出第1行首地址
printf("*(p + 1)=%d\n", *(p + 1));//输出第1行,第0列元素的地址
printf("*(*(p + 1))=%d\n",*(*(p + 1)));//输出第1行第0列元素的值
printf("*(p+1)+2=%d\n", *(p + 1) + 2);//输出第1行第2列元素的地址
printf("*(*(p + 1)+1)=%d\n", *(*(p + 1)+2));//输出第1行第2列元素的值
for(int i=0;i<2;i++)
for (int j = 0;j < 3;j++)
{
//printf("%d\n", p[i][j]);
printf("%d\n", *(*(p + i) + j));//和上一句等同
}
}
运行结果:
4 15924692,15924704 p+1=15924704 *(p + 1)=15924704 *(*(p + 1))=4 *(p+1)+2=15924712 *(*(p + 1)+1)=6 1 2 3 4 5 6 请按任意键继续. . .
总结可以发现:对于一个指向二维数组的指针,只有出现两个*或者两个[]或者一个*和一个[]的情况下(没有出现&时)才是对应的二维数组中某一行某一列的元素的值,只出现一个或0个[]和*的情况)是表示的地址。