C++;为什么这里用了swap函数而没有发生交换?

#include"iostream.h"voidswap(intx,inty);intmain(){inta=2,b=3;swap(a,b);cout<<"a="<<a<... #include"iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}

得到结果是a=2 b=3 没有交换
无法理解,请详细解释
展开
 我来答
不知详解
2009-09-06 · 知道合伙人软件行家
不知详解
知道合伙人软件行家
采纳数:609 获赞数:2252
自学计算机。

向TA提问 私信TA
展开全部
其实这个问题主要取决于你的swap函数所修改的x,y是不是main函数中的a,b
运行结果告诉你不是.
那么x,y是什么呢 x,y代表的是函数栈当中的参数.
相信你听说过函数调用的过程有压栈这一说法吧。
其实x,y是储存在栈当中的
函数调用的时候会为传入参数在栈当中生成值相等的副本。
x,y代表的就是这个副本,而不是代表传入参数。所以你修改x,y不能修改a,b。
如果想要修改a,b就必须知道a,b所在的内存地址.所以可以通过传入地址解决问题.

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

如果使用c++可以使用引用解决问题,引用大多数编译器也是通过指针实现的.
void swap(int &x,int &y){
int a;
a=x;
x=y;y=a;
}
----------
很多人都说实参和形参是这个问题原因。
其实我说的是本质.形参和实参只是起概念上的作用罢了。并不能准确的理解这个问题.
silvernii
2009-09-06 · TA获得超过3638个赞
知道大有可为答主
回答量:1667
采纳率:0%
帮助的人:1624万
展开全部
调用swap(a,b);可以理解成执行下面这一段代码
{
int x=a;
int y=b;
int temp=x;
x=y;
y=temp;
}
可以看出,调换的只是x和y的值,a与b的值并没有发生变化
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3288627d1
2009-09-06 · TA获得超过1175个赞
知道小有建树答主
回答量:1637
采纳率:0%
帮助的人:557万
展开全部
这是因为调用函数时进行的是 值传递

swap(a,b);实际上执行的是把a的值传给x,把b的值传给y,在函数内部把x,y的值交换了。但实际上a,b的值并没有变。
要想改变a,b的值可以这样:

#include"iostream.h"
void swap(int *x,int *y);
int main()
{
int a=2,b=3;
swap(&a,&b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6fe6fa45d
2009-09-06 · TA获得超过606个赞
知道小有建树答主
回答量:237
采纳率:0%
帮助的人:224万
展开全部
形参改变不影响实参,所以要取地址。代码如下。
#include"iostream.h"
void swap(int &x,int &y);
int main()
{
int a=2,b=3;
swap(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
也可以直接把输出放在函数中
#include"iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);

return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
cout<<"a="<<x<<endl;
cout<<"b="<<y<<endl;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sharebophar
2009-09-06 · TA获得超过609个赞
知道小有建树答主
回答量:350
采纳率:0%
帮助的人:123万
展开全部
楼上都已经说的很清楚了,建议 参考值传递,指针传递,引用传递,别名传递等不同传递方式加以区分;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式