先看一道題:
1 #include <iostream> 2 3 void main() 4 { 5 int n[][3] = {10,20,30,40,50,60}; 6 int (*p)[3]; 7 p=n; 8 cout << p[0][0] << "," << *(p[0]+1) << "," << (*p)[2] <<endl; 9 return 0; 10 }
輸出結果為:10,20,30
上題考察的數組指針和二維數組之間的關系,其中n是一個2*3的二維數組,p是一個數組指針,數組指針是一個指針,指向一個數組。這里的p在(*p)中,說明p是一個指針,指針的類型是int(*)[3],指針所指向的類型為int[3],所以指針p指向一個長度為3的數組。
一開始p指向n的第0行,因為第0行就是一個長度為3的數組。p[0]表示第0行的首地址(即&n[0][0]),p[0]+1表示第0行首地址偏移一個地址,即n[0][1]的地址(&n[0][1])。所以*(p[0]+1) 為n[0][1],答案是20。
p==&p[0],表示第0行(因為下標從0開始),所以*p == p[0],表示第0行的首地址,所以(*p)[2] 為p[0][2],即n[0][2],答案是30。
總結:
直接在p上移動就是移動行,在*p上移動就是移動列。比如:**(p+1)等於p[1][0],*(*p+1)等於p[0][1]。
未完待續~
