一、多維數組其本質是數組的數組。
int a[3][4]; //大小為3的數組,里面的元素是含有4個元素的數組
int a1[3][4][5]; //大小為3的數組,它的每個元素都是大小為4的數組,這些數組里面的元素是含有5個整數的數組
面試題:
int a[4][5],(*p)[5];
p = a;
下面哪個選項表示a數組中的元素?
A. p+1
B. * (p+3)
C. * (p+1)+3
D. * (* p+2)
分析:p是一個指針,指向一個一維數組,里面有5個int類型的元素
a可以理解成一個一維數組,里面的元素為a0,a1,a2,a3
a1還是一個一維數組,里面的元素為a10,a11,a12,a13,a14
#include <iostream> #include <stdio.h> using namespace std; int main() { int a[4][5], (*p)[5]; p = a; cout << p << endl;//輸出007FFC18 cout << p + 1 << endl;//輸出007FFC2C,相差20 cout << p + 2 << endl;//輸出007FFC40,同樣相差20 return 0; }
根據指針的加減法,對照以上代碼及輸出,不難理解,p = a后,
p是指針,指向a的第一個元素,a0,
所以*p相當於解引用了,表示a0這個對象,
而a0這個對象也是一個數組,把它理解成數組名,它就是a0第一個元素的地址,
即*p表示指針,指向a00,
再解引用*(*p)就是a00這個對象了。
這里有點繞,更加麻煩的是這里指針的加減法每次加減的字節數發生了變化,
p直接加減時,每次增加的字節數是20,相當於a0所占的內存,
*p加減時,每次增加的字節數是4,相當於a00所占的內存,
原因:判斷每次增加的字節數前,要先判斷這個指針所代表的的含義。
所以ABC選項很好排除
D選項 * (* p+2),p表示數組a(數組a內第一個元素a0的地址),
* p表示數組a0(數組a0內第一個元素a00的地址),
* p+2表示a02的地址,所以* (* p+2)表示a[0][2]。
驗證如下:
#include <iostream> #include <stdio.h> using namespace std; int main() { int a[4][5] = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int(*p)[5]; p = a; cout << *(*p + 2) << endl;//輸出1 return 0; }