首页 > 用户发贴区 > 编程问题提问区 > 各位高手帮忙!
2008
08-16

 


我是c语言初学者,为什么下面的结果是a=10,b=20;而不是a=20,b=10;


#include <stdio.h>
void SWAP(int x,int y);
void swap(int *x,int *y);
void main()
{
  int a=10,b=20;
  SWAP(a,b);
  printf(“%d,%d\n”,a,b);
}
void swap(int *x,int *y)
{
  int temp;
  temp=*x;
  *x=*y;
  *y=temp;
}
void SWAP(int x,int y)


{
  swap(&x,&y);
}


各位高手帮忙!》有 5 条评论

  1. TONYAZITEN 说:

    其实想传引用调用下面着个代码就可以了

    #include <stdio.h>

    void swap(int *x,int *y);
    void main()
    {
      int a=10,b=20;
      swap(&a,&b);
      printf(“%d,%d\n”,a,b);
    }
    void swap(int *x,int *y)
    {
      int temp;
      temp=*x;
      *x=*y;
      *y=temp;
    }

    但是我也不明白为什么多加了一层就不行了 还是等高人吧

  2. mhjerry 说:

    哦,这是一道考题,还是谢谢你!

  3. whos 说:

    我认为关键的是这两句代码:

    swap(&x,&y);和void swap(int *x,int *y);

    程序执行swap(&x,&y)时传递的是变量a和b的地址,而void swap(int *x,int *y);声明的是指针。因为指针指向地址,所以可以看做swap(&x,&y)传递的是指向变量a和b的指针。

    void swap(int *x,int *y)
    {
      int temp;
      temp=*x;
      *x=*y;
      *y=temp;
    }
    这段程序中的x和y应该是&a和&b,*x和*y就应该是*(&a)和*(&b),也就是a和b。下面就是temp=a;a=b;b=temp;函数中交换数据并不影响主函数中变量的值。

    调试了半天,我就得出了这个结论。有错误的话还请指出。

  4. mhjerry 说:

    先谢谢你,不过按你的这种说法,下面这段程序也交换不了数据了:

    #include <stdio.h>

    void swap(int *x,int *y);
    void main()
    {
      int a=10,b=20;
      swap(&a,&b);
      printf(“%d,%d\n”,a,b);
    }
    void swap(int *x,int *y)
    {
      int temp;
      temp=*x;
      *x=*y;
      *y=temp;
    }

    我后来想了想,如果单看下面的程序

    void swap(int *x,int *y)
    {
      int temp;
      temp=*x;
      *x=*y;
      *y=temp;
    }
    void SWAP(int x,int y)

    {
      swap(&x,&y);
    }
    姑且把SWAP看做主函数,函数swap调用结束后,*x,*y的值确实换了,关键是main函数调用SWAP结束后,x,y不复存在(已释放)。所以问题关键是main函数中的实参是a,b;

    而并非指针!

    我亦不知对不对,希望指出!

  5. xstar 说:
    关键在 SWAP函数上,这个函数的调用传递的是值不是地址,所以影响不到外部变量。
    值是交换了,不过交换的是函数定义中的局部变量 x,y。

    修改函数

     
    void SWAP(int x,int y)
    {
      printf( “%d,%d\n”, x, y );
      swap(&x,&y); 

      printf( “%d,%d\n”, x, y );
    }
    看看中间变量的输出效果!

留下一个回复