昨天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所需内容。
至于说使用哪种方法,就是仁者见仁的事了。