免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2845 | 回复: 2
打印 上一主题 下一主题

[C++] 对二维数组名解除引用会怎么样? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-23 14:29 |只看该作者 |倒序浏览
int a[][2] = {1,2,3,4};
        cout << a << endl;
        cout << *a << endl;
        cout << *a+1 << endl;
        cout << a+1 << endl;
        cout << a[1]<< endl;
        cout << *(a+1)<< endl;
        cout << *(a[1])<< endl;
结果输出为   :
0012FF70
0012FF70
0012FF74
0012FF78
0012FF78
0012FF78
3

以为都搞明白了,自己测了下又糊涂了..
搞不明白 : 1.  既然数组名可以作为指针使用,为什么对它解除引用的结果不是它指向地址的存储值?
            2.  a+1    a[1]   返回值都是指针值:0012FF78 ,那么为什么 *(a+1)    *(a[1])返回的一个是地址,一个是int值3呢?
和优先级也没有关系,到底编译器怎么处理的呢?

[ 本帖最后由 facetosky 于 2008-5-23 14:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-23 15:02 |只看该作者
关于数组的退化请见:
http://bbs.chinaunix.net/viewthread.php?tid=1031622

int a[][2] = {1,2,3,4};
(1)        cout << a << endl;

a会退化成&a[0], 类型为pointer to int[2]

(2)       cout << *a << endl;

a会退化成&a[0] pointer to int[2]
*a的类型为int[2]
最后,*a会退化成&(*a)[0],即&a[0][0]

(3)        cout << *a+1 << endl;

接上面,*a为&a[0][0],则*a+1则为&a[0][1]

(4)        cout << a+1 << endl;

a会退化成&a[0], 则a+1即为&a[1]

(5)        cout << a[1]<< endl;

a[1]类型为int[2],它会退化为&a[1][0]

(6)        cout << *(a+1)<< endl;

a会退化成&a[0], 则a+1即为&a[1]
*(a+1)则为a[1],其类型为int[2]
因此,它又会退化为&a[1][0]

(7)        cout << *(a[1])<< endl;

a[1]类型为int[2],它会退化为&a[1][0]
*a[1]即为a[1][0]

[ 本帖最后由 ypxing 于 2008-5-23 16:45 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-05-23 16:43 |只看该作者
太好了,回答的很仔细,谢谢啊!!!你以前那个帖子没见到,累你了!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP