下面看二维数组:
int a[3][4];
改写下形式,也许,你就懂了 int (a[3])[4];
a[0], a[1], a[2] //他们都是int [4]的类型,都是4个int元素的首地址,你可以画个图
a // 是 int [3] [4]的类型,它是a[0] , a[1], a[2] ,3个元素的首地址,画个图;
a + 1 就是&a[1] , a + 2 就是&a[2];
*(a + 1 ) + 2 就是 a[1] + 2, 也就是 &a[1][2], 于是 *( *(a + 1) + 2) 就是a[1][2];
现在看二维指针和数组指针,
int * * pi; // pi = a;这里的赋值是不可以的,你懂的,类型不一样,除非你强制转换
int (*pj)[4]; // pj = a; 这里赋值是可以的;数组指针
假设int 4个字节,指针也都是4个字节,而且 pj = pi = 0 (地址十进制)
pi + 1 // 地址是 4,偏移了一个int*的元素,
pj + 1 // 地址是 16,偏移了4 * 4个int元素,