2009
04-08

#include<tdio.h>
void fun(int *a)
{
a[0]=a[1];
}
main()
{
int a[10]={10,9,8,7,6,5,4,3,2,1},i;
for(i=2;i>=0;i++) fun(&a[i]);
for(i=0;i<=9;i++) printf(“%d”,a[i]);
printf(“\n”);
}


答案是(7777654321)
为什么是这个答案啊???


求助》有 5 条评论

  1. delfeer 说:

    仔细分析一下

    void fun(int *a)
    {
    a[0]=a[1];
    }

  2. 忧郁王子 说:

    就是那个地方不懂啊。
    哪一位知道请讲一下,谢谢了!!!!

  3. whos 说:

    这个程序是错的,根本没有执行结果,注意这句:

    for(i=2;i>=0;i++) fun(&a[i]);

    循环条件 i>=0 ,因为后面是 i++ ,所以循环条件永远为真。

  4. whos 说:

    把上面的 i++ 改为 i– 就出现了你说的结果,仔细分析一下啊。

    当 i = 2 时,传入 fun 的是 a[2] 的地址,这个时候 fun 中的数组地址 a 是传入的 a[2] 的地址,其实这个时候 a[0]的实际地址等于 a[2] 的地址,a[1] 的实际地址等于 a[2] 的地址加一,即原数组 a 中 a[3] 的地址。语句 a[0]=a[1] 的执行结果就是 a[2]=a[3]。

    后面以此类推,就是 i=1,0 时,执行的语句实际是 a[1]=a[2] , a[0]=a[1]。

    有点类似汇编中的段地址和段偏移地址。

    呵呵……

  5. 忧郁王子 说:

    哦,我写错了,
    懂了,谢谢了!!!

留下一个回复