Chinaunix

标题: 关于数组的一点思考! [打印本页]

作者: veking    时间: 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 编辑 ]
作者: tyc611    时间: 2008-07-23 23:59
没那么复杂,参考我在下帖15楼的回复
http://bbs.chinaunix.net/thread-1221223-1-1.html
作者: baicj    时间: 2008-07-24 00:12
lz纯属猜测。。想要分析的话,直接gcc -S看汇编就明白了,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2