q是一个数组指针,指向一个数组,该数组包含4行5列整型元素,用int[4][5]表示;
q = &a; // 让q指向a[4][5]
(*q)[3][4] = 1; // 把q=&a代入,相当于 (*&a)[3][4],也就是a[3][4]
首先,aa可以视作3个int[4][5],如下
aa =
int[4][5] // 编号0,即:(aa[0])[4][5]
int[4][5] // 编号1,即:(aa[1])[4][5]
int[4][5] // 编号2,即:(aa[2])[4][5]
这样的话
q = aa; // 相当于:q = &aa[0]
q++; // 相当于:q = &aa[1] (此处可参考一维数组的指针运算)
(*q)[1][2] = 3; // 把q = &aa[1]代入,得(*&aa[1])[1][2],也就是aa[1][1][2] = 3
*q[1][2] = 5;
上式理解如下:
首先,q = &aa[1],q[1]相当于*(q+1),即q+1=&aa[2],则原式=*((*(q+1))[2])
其次,(*(q+1))[2],相当于*((*(q+1)) +2) = *(*(q+1) + 2) // 根据操作符优先级,减少一队括号
最后,注意到q+1=&aa[2],所以原式 = *( *(*(q+1) + 2) + 0) = aa[2][2][0]
PS1:三维数组,不太好画图,这样也应该能理解。
PS2:注意到q[1]为*(q+1),即基于q中的地址向后移动一个元素,q+1是这个元素的地址,*(q+1)是这个元素的值,q[1]相当于两步操作。