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;
}
优质内容筛选与推荐>>
1、B2B网站的推广方法
2、我和同伴写源代码遇到的问题
3、关于使用MySql出现的内存泄漏问题
4、【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)
5、每日成果


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn