- 论坛徽章:
- 0
|
这几天在CU上看到很多讨论C基础知识的帖子,感觉受益匪浅,同时也产生了一些疑惑,请大家帮忙看看理解的是否正确!- #include <stdio.h>
- int main(void)
- {
- int a[3] = {1,2,3};
- printf("a = %p, &a = %p\n", a, &a);
-
- return 0;
- }
复制代码 以上代码的执行结果为:
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 编辑 ] |
|