免费注册 查看新帖 |

Chinaunix

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

[C] 指针与数组的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-26 09:52 |只看该作者 |正序浏览
如下代码打印的信息为何如此,该如何理解,编译器怎么处理呢?

int nums[2][3] = {{1, 2, 3},{4,5,6}};

printf("%x\n", *(nums + 1));    // 打印的是{4,5,6}的地址
printf("%x\n", *nums[1]);        // 打印的是 4 元素的值
printf("%x\n", (*nums)[1]);      // 打印的是 2 元素的值

主要的问题是 nums[1] 在编译的时候不是变成 nums + 1 吗,即第一个打印语句与第二个打印语句应是相同的

论坛徽章:
0
6 [报告]
发表于 2012-07-27 09:45 |只看该作者
本帖最后由 jerrymy 于 2012-07-27 09:52 编辑

括号的优先级。

(*nums)[1] 先间接引用,对于二位数组,数组名的值是第一个元素的地址,所以*nums指向{1,2,3}的第一个元素,所以(*nums)[1]是第二个值。

*nums[1],从右向左结合,[]优先级高,所以先执行nums[1],此时nums指向{4,5,6},再间接引用指针即是第一个元素4。

《C和指针》讲的很详细。

论坛徽章:
0
5 [报告]
发表于 2012-07-26 11:48 |只看该作者
弄明白了,主要是感觉int num[3]的num与&num的区别比较容易弄乱自已,谢谢各位

论坛徽章:
0
4 [报告]
发表于 2012-07-26 11:33 |只看该作者
回复 2# bruceteen
nums + 1 时 nums需要先降为指针,即 int (*)[3],所以 nums+1 为指向 {4,5,6} 的 int (*)[3]

nums[1] 为 {4,5,6},前面加个*号,不就是4嘛(还是数组降为指针)

*nums 为 {1,2,3},后面加个[1],不就是2嘛


也就是说nums + 1是一个指向3个元素的数组指针,因此 *(nums + 1) 为 {4, 5, 6},即[4,5,6]数组的地址,所以输出是地址,
nums[1]为 {4, 5, 6},即[4,5,6]数组的地址,固*nums[1]为4

我这样理解应该是对的吧?

只是我有个疑问,上面的理解是从C的指针知识来分析的
我就是不理解 nums + 1 与 nums[1] 编译器是如何区分这两种情况的,nums[1]编译器不是将下标作为偏移量处理吗,即变成
nums + 1 ?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2012-07-26 11:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2012-07-26 10:53 |只看该作者
nums + 1 时 nums需要先降为指针,即 int (*)[3],所以 nums+1 为指向 {4,5,6} 的 int (*)[3]

nums[1] 为 {4,5,6},前面加个*号,不就是4嘛(还是数组降为指针)

*nums 为 {1,2,3},后面加个[1],不就是2嘛
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP