对于二维数组,&a与&a[0]与a一样吗?

一样,又不一样。
说一样,是因为它们的值是一样的;说不一样,是因为他们的类型不一样。
这里,我做了一组测试:

int a[2][2] = { 1,2,3,4 };
auto g = &a;
auto p = &a[0];
auto q = a[0];
cout << g << endl;
cout << p << endl;
cout << q << endl;

输出的结果都是008FFE98。
那么使他们自加1会怎么样呢?

++q;
    ++p;
    ++g;
    cout << g << endl;
    cout<< p << endl;
    cout << q << endl;

输出的结果依次是:
008FFEA8
008FFEA0
008FFE9C
由此可以得出结论:他们所指的对象不一样!
现在来看刚才三个auto的真实类型是什么。
我把auto全部换成int,vs给我报错的同时也告诉了我他们的类型:
这里写图片描述
这里写图片描述
这里写图片描述

所以他们真正的类型是:

    int (*g)[2][2]= &a;
    int (*p)[2]= &a[0];
    int *q = a[0];

反正是类似于函数指针的东西吧。
g是指向整个二维数组的指针,p是指向二维数组中整个a[0]的指针,q是指向a[0][0]的指针;当他们各自自加1时:g指向下一个相邻的下一个二位数组,p指向a[1],q指向a[0][1];此时g指向的东西是未知的,所以这时候输出什么都不奇怪,我们来看看这时输出g指向的二维数组的元素是什么吧:

for (int i = 0; i < 4; ++i) {
        cout << (*(*g)+i) <<"   "<< *(*(*g)+i)<<endl;
    }

这里写图片描述
你看,输出的是这种乱七八糟的东西。

最后,献上测试的全部代码:

#include<iostream>
using namespace std;
int main() {
    int a[2][2] = { 1,2,3,4 };
    int (*g) [2][2]= &a;
    int (*p)[2]= &a[0];
    int *q = a[0];

    cout << g << endl;
    cout << p << endl;
    cout << q << endl;
    ++q;
    ++p;
    ++g;
    cout << g << endl;
    cout<< p << endl;
    cout << q << endl;

    cout << endl;
    for (int i = 0; i < 4; ++i) {
        cout << (*(*g)+i) <<"   "<< *(*(*g)+i)<<endl;
    }
    system("pause");
    return 0;
}

这里写图片描述

最后说明一下a[0]和&a[0][0],前者是一维数组,后者是指针,虽然不一样,但是两者各自加1后都是指向a[0][1]的。

//更新
今天才发现原来有typeid().name()这么个函数,用这个函数就能直接输出类型了,真是一个悲伤的故事呢。

#include<iostream>
using namespace std;
int main() {
    int a[2][2] = { 1,2,3,4 };
    int(*g)[2][2] = &a;
    int(*p)[2] = &a[0];
    int *q = a[0];

    cout << typeid(g).name() << endl;
    cout << typeid(p).name() << endl;
    cout << typeid(q).name() << endl;

    system("pause");
    return 0;
}

这里写图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值