swap()引起的指针思考
来源:互联网 发布:淘宝助理导入模板 编辑:程序博客网 时间:2024/04/29 21:03
原帖:http://www.cppblog.com/qjbest/archive/2006/05/25/7621.aspx
昨天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所需内容。
至于说使用哪种方法,就是仁者见仁的事了
- swap()引起的指针思考
- 由返回局部指针问题引起的思考!
- 吃饭引起的思考
- Disruptor引起的思考
- ClassNotFoundException引起的思考
- VS2010 swap()操作引起的问题
- Jobster裁员引起的思考
- Jobster裁员引起的思考
- Jobster裁员引起的思考
- 一个问题引起的思考
- 由DevOps引起的思考
- 字符串常量引起的思考
- 字符串常量引起的思考
- 一个粗心引起的思考
- 字符串常量引起的思考
- 字符串常量引起的思考
- 某个小事引起的思考
- 一个困惑引起的思考
- InnoDB和MyISAM 异同
- FMS学习(五):上传本地视频
- Windows自动更新变成灰色不能修改设置的问题
- Blend基础-布局控件
- php PDO 链接 mysql 最简单 实例
- swap()引起的指针思考
- html与xml的异同
- 你业余时间在做什么?
- 一个美国老网络工程师,给年轻工程师的忠告
- SEO经验分享
- Blend基础-控件与用户控件
- 简单的创建table
- 调整参数对bp网络的影响
- java布局管理器