//定义一个三行两列的二维数组
int a[3][2] = {{1,3},{2,4},{5,7}};
/*p先和*结合,表示p是一个指针,int[2] 是他的类型,说明指针指向一个有两个元素的数组.
二维数组的列元素个数一致。上面定义的二维数组有两列,故定义行指针时使用int[2]*/
int (*p)[2] = a;
cout<<*p<<endl; //输出0x61fe00.即二维数组中第一个一维数组首元素的地址。
cout<<**p<<endl; //输出1.即二维数组中第一个一维数组首元素的值。
cout<<*p[0]<<endl;效果同上
cout<<*a[0]<<endl;效果同上。
cout<<*(p+i)<<endl; 输出二维数组第i行一维数组首元素地址。
cout<<*(p+i)+j<<endl;输出二维数组第i行一维数组第j列的元素的地址。
cout<<p[i]+j<<endl;效果同上。
cout<<a[i]+j<<endl;效果同上。
cout<<*(*(p+i)+j)<<endl;输出二维数组第i行一维数组第j列的元素的值。
cout<<*(*(p+1)+1)<<endl; 输出4.下标要从0开始算。第0行是{1,3},第一行是{2,4}
cout<<*(p[i]+j)<<endl;效果同上。
cout<<*(a[i]+j)<<endl;效果同上。
另 p++与*p++和**p++都会改变指针的指向。二维数组中p++和*p++和**p++会跳到下一行数组首元素地址。++和 * 优先级相同。结合方向自右向左。故p++ 是返回p指针,然后指向下一个数值的地址。
int a[3][2] = {{1,3},{2,4},{5,7}};
int (*p)[2] = a;
cout<<**p<<endl; //输出1.
p++;//或者*p++。或者**p++三者效果一样。
cout<<**p<<endl;输出2.由此可见p++是直接跳了定义指针的时候一维数组的长度的地址。