昨天QQ里有个学C++的朋友问我个问题,怎样利用swap(int *x,int *y)交换x,y指向的地址值。起初我很简单的给了他一个方法:

方法一:
int *p;
void swap(int *x,int *y)
{
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
 p=x;
 x=y;
 y=p;
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
}
int main()
{
 int a=10;
 int b=2;
 int *x=&a;
 int *y=&b;
 cout<<*x<<" "<<*y<<endl;
 swap(x,y);
 cout<<*x<<" "<<*y<<endl;
}
运算结果却是:
10  2
10  2   //swap
2    10 //swap
10  2
从结果上可以看出swap()仍然没有起到效果

接着用&来做实验
方法二:
void swap(int &x,int &y)
{
 cout<<"swap("<<x<<","<<y<<")"<<endl;
 int temp;
 temp=x;
 x=y;
 y=temp;
 cout<<"swap("<<x<<","<<y<<")"<<endl;
}
int main()
{
 
 int a=10;
 int b=2;
 int &x=a;
 int &y=b;
 cout<<x<<" "<<y<<endl;
 swap(x,y);
 cout<<x<<" "<<y<<endl;
}
运算结果是:
10  2
10  2   //swap
2    10 //swap
2    10
从结果上可以看出swap()起到预定效果

用int *&做实验
方法三:
int *p;
void swap(int *&x,int *&y)
{
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
 p=x;
 x=y;
 y=p;
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
}
int main()
{
 int a=10;
 int b=2;
 int *x=&a;
 int *y=&b;
 cout<<*x<<" "<<*y<<endl;
 swap(x,y);
 cout<<*x<<" "<<*y<<endl;

运算结果是:
10  2
10  2   //swap
2    10 //swap
2    10
从结果上可以看出swap()起到预定效果

最后,再次用int *做实验,注意swap()部分的变化
方法四:
void swap(int *x,int *y)
{
 int temp=0;
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
 temp=*x;
 *x=*y;
 *y=temp;
 cout<<"swap("<<*x<<","<<*y<<")"<<endl;
}
int main()
{
 
 int a=10;
 int b=2;
 int *x=&a;
 int *y=&b;
 cout<<*x<<" "<<*y<<endl;
 swap(x,y);
 cout<<*x<<" "<<*y<<endl;
}
运算结果是:
10  2
10  2   //swap
2    10 //swap
2    10
从结果上可以看出swap()起到预定效果
=============================================================
好,现在来说下为什么使用方法一和方法四,同样是传递的地址,为什么结果会不同?答案就在swap(int *x,int *y)上。在main()里虽然有x和y指针,但是,在swap()里的x,y却是临时变量。首先说明这一点是有好处的。我们来继续分析以下代码内容:
 (一)
   p=x;  //该方法看似我们希望通过交换临时指针x,y所指向的地址,来达到交换main()函数中实参x,y所指
   x=y;  //向地址,从而达到交换数值的效果。虽然逻辑上是正确的,程序编译也通过,但是,却忽略了  
   y=p; //一个非常重要的内容,那就是swap()中的x,y仍然是临时的,虽然该程序确实在swap中暂时交换
           //了x,y所指向的地址,但是实际上x,y所指向地址的数值仍然没有被改变!

 (四)
   int temp=0;   //通过对 方法一 的总结,我们作如下调整,在swap()函数中,我们立刻改变临时指针 
   temp=*x;     //x,y所指向地址的数值,即改变main()函数中实参指针x,y所指向地址的数值。所以,即使
   *x=*y;         //swap()函数调用完后内部临时x,y消失,但它们所做的工作已经完成:改变数值!
   *y=temp;

同理,对于方法三和方法二,通过int & 和int *&也是做了类似方法四的工作,所以能正确swap所需内容。
至于说使用哪种方法,就是仁者见仁的事了。