C++多维数组

一、多维数组其本质是数组的数组。

  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;
}

猜你喜欢

转载自www.cnblogs.com/maider/p/11129048.html
今日推荐