一、多维数组其本质是数组的数组。
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; }