Chinaunix
标题:
关于数组的一点思考!
[打印本页]
作者:
veking
时间:
2008-07-23 23:44
标题:
关于数组的一点思考!
这几天在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 编辑
]
作者:
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