免费注册 查看新帖 |

Chinaunix

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

[C] 关于数组的一点思考! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 23:44 |只看该作者 |倒序浏览
这几天在CU上看到很多讨论C基础知识的帖子,感觉受益匪浅,同时也产生了一些疑惑,请大家帮忙看看理解的是否正确!
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.   int a[3] = {1,2,3};
  5.   printf("a = %p, &a = %p\n", a, &a);
  6.   
  7.   return 0;
  8. }
复制代码
以上代码的执行结果为:
a = 0xbff88170, &a = 0xbff88170

ps: 这个结果只是在我机器上编译产生的结果,不同机器不同编译器可能产生不同结果.

从上面的结果上来看, a 和 &a 居然相同,是在意料之外的,本来以为会不同的,下面说下不同的原因:

分析一:
变量地址  1000  | 1004 | 1008 | 1012
            -------------------------------------
变量的值| 1000 |     1    |    2    |    3   |
            -------------------------------------

                              (图1)

a[0]  -->  *(1000 + (++0) x 4)  --> *(1004)  --> 1
a[1]  -->  *(1000 + (++1) x 4)  --> *(1008)  --> 2
.....

分析二:
变量地址  1000  | 1004 | 1008 | 1012
            -------------------------------------
变量的值| 1004 |     1    |    2    |    3   |
            -------------------------------------

                              (图1)

到底应该取a的地址去计算呢? 还是取a的值去计算呢?
a[0]  -->  *(1004 + (++0) x 4)  --> *(1008)  --> 2
a[1]  -->  *(1004 + (++1) x 4)  --> *(1012)  --> 3
.....
或者
a[0]  -->  *(1004 + 0 x 4)  --> *(1004)  --> 1
a[1]  -->  *(1004 + 1 x 4)  --> *(1008)  --> 2
.....

a[0]  -->  *(1000 + (++0) x 4)  --> *(1004)  --> 1
a[1]  -->  *(1000 + (++1) x 4)  --> *(1008)  --> 2
.....

请大家看看到底那种分析方式是正确的,又或者以上的分析都不正确,那么也请说说应该如何正确解释呢?

[ 本帖最后由 veking 于 2008-7-23 23:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-23 23:59 |只看该作者
没那么复杂,参考我在下帖15楼的回复
http://bbs.chinaunix.net/thread-1221223-1-1.html

论坛徽章:
0
3 [报告]
发表于 2008-07-24 00:12 |只看该作者
lz纯属猜测。。想要分析的话,直接gcc -S看汇编就明白了,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP