这段C++程序为什么不能交换两个变量的值??

#include<iostream>usingnamespacestd;voidswap(int*,int*);intmain(void){inta=100,b=200,... #include <iostream>

using namespace std;

void swap(int *, int *);

int main(void)
{
int a = 100, b = 200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1, p2);
cout << *p1 << " " << *p2 << endl;
return 0;
}

void swap(int *x, int *y)
{
int *t;
t = x;
x = y;
y = t;
}
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~(我知道如果省略这个函数的内容而直接写在MAIN中可以顺利实现)我就是想知道这个错误的详细原因解释。。谢谢各位。
展开
 我来答
风骚的可乐
2007-12-10 · TA获得超过1550个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:608万
展开全部
void swap(int *x, int *y) // 给定2个整型指针,交换其内容
{
int *t; // 临时指针
t = x; // 这里只是将指针进行赋值,而不牵扯到指针指向的内容
x = y;
y = t; // 执行结束后, x,y,t三个指针将指向同一空间
}

比如主函数中,
a的值是100,a的地址是0x11223344;
b的值是200,b的地址是0x44332211;

那么我们调用swap的时候:
x的值是0x11223344,y的值是0x44332211;
t的值初始化为0x11223344(与x相同);
执行x=y;y=t;之后,x的值为0x44332211;
y,t两者的值都为0x11223344。

也就是说,此时x所指向的内容为200,y指向的内容为100。
看到这里你可能要问,两个数貌似是被换了的,但是为什么主函数中没有被换?

其实,当p1和p2被传递给swap的时候,传递过去的只是指针变量的副本(注意,是指针本身,而不是指针指向的内容)。如果不改变swap的内容的话,我们就需要将x和y声明为指针引用,如下:
void swap(int* &x, int* &y)
{ …… }

问题:
正确的函数内交换方法我知道。。。既然指针可以在调用函数内保留地址,为什么在SWAP函数内如上写法就还是不能交换呢?费解~~~~~~~~

答:
请参看相关书籍的“引用”及“指针引用”章节。
西方惨败
2007-12-10 · TA获得超过1570个赞
知道小有建树答主
回答量:890
采纳率:0%
帮助的人:1092万
展开全部
专门把谭浩强的《C程序设计》翻出来。原文是这么写的:不能企图通过改变指针形参的值而值指针实参的值改变。C语言中实参变量的形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量 所指变量 的值。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
thgfwhb
2007-12-10 · TA获得超过181个赞
知道小有建树答主
回答量:469
采纳率:0%
帮助的人:0
展开全部
因为指针传递也属于值传递。
#include <iostream>

using namespace std;

void swap(int *, int *);

int main()
{
int a=100, b=200, *p1, *p2;
p1 = &a;
p2 = &b;
swap(p1,p2);
cout << *p1 << " " << *p2 << endl;
cout<<a<<b;
return 0;
}

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

把程序改成我这样就可以了,还是你定义的函数的问题。问题的原因主要在于,你在swap函数中两个参数其实是通过形参交换的地址值只是在形参中变化,并没有影响到实参的变化。所以你应该写成
int t;
t = *x;
*x = *y;
*y = t; 才可以。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
包靖荷be
2007-12-10 · TA获得超过109个赞
知道小有建树答主
回答量:284
采纳率:0%
帮助的人:179万
展开全部
传递的是参数是内存地址,用你的方法在子函数中对调地址,但是本来p1,p2地址所对应的数值没有变。
要改变地址所对应的数才行
void swap(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式