c++指针形参交换什么时候影响实参

比较下面三个交换程序voidswap(int*p1,int*p2)voidswap(int*p1,int*p2)voidswap(int*p1,int*p2){int*t... 比较下面三个交换程序

void swap(int *p1,int*p2) void swap(int *p1,int *p2 ) void swap(int *p1,int *p2)
{int *temp; {int *p; {int temp;
temp=p1; p=p1; temp=*p1;

p1=p2; p1=p2; *p1=*p2;
p2=temp; p2=p1; *p2=temp;
} } }
这三个程序只有第一个最后的结果没有变化,其他在引用的时候数值都发生了交换,为什么第一个会没有变化,还有就是第二个和第三个有什么区别,第二个是不是p1,p2的的地址发生了变化,而第三个是不是p1,p2所指的a,b的值发生了变化,及main函数中p1,p2所指的值
展开
 我来答
jackwind1987
2013-09-18 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:496万
展开全部
你这第一个和第二个有什么不一样的么,就是把temp换成了p。
第一个和第二个都不会有变化,第三个会交换。
要理解指针和指针变量的含义,我们平时说的指针,一般指的就是指针变量。指针变量也是变量,它的值也会变化。指针变量保存的是一个内存地址。
函数调用的过程中,先要把实参复制给形参,如果参数是指针类型,那么就是把指针变量复制了过去,所以实参和形参是两个不同的指针变量,只不过是保存的内存地址是一样的。可以拿int类型来类比。相当于:int a, b; a = 100; b = a; 这里a和b是两个不同的变量,同样实参的指针变量和形参的指针变量也是两个不同的变量,修改a并不会影响b。所以第二个里面p=p1; p1=p2; p2=p1;修改的是形参的指针变量,执行完之后,实参的指针变量并没有改变指向的内容。而第三个里面就不一样了,它修改的不是指针,而是指向的内存,实参和形参指向的内存是同样的,所以实参指针变量指向的内容被修改了。

所以,理解了指针的原理和函数调用的原理就能明白这个问题了,不能简单地认为只要传递指针就能改变实参。
追问
void swap(int *p1,int *p2 )是被main引用的,p1=&a,p2=&b,所以不是单纯的形参变化,书上写的是第一二个会变化,而第三个不会变化。。。
追答
光看函数定义,不看调用,两个确实是一摸一样的,即使看调用的地方也不会有什么不同。
书上写的不一定是对的,其实最简单的办法是自己试一下到底会不会变化。当然我们说的也不一定是对的,请酌情相信。
匿名用户
2013-09-18
展开全部
C语言才要考虑这种问题,C++为了避免这种难以理解的东西而专门引入了“引用”,就是希望不要用C语言式的编程办法,搞得代码难以理解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-09-18 · TA获得超过301个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:209万
展开全部
你写的除了第三个其他都没结果,因为它们只对形参做交换。和实参没有一点关系,实参把数据复制给形参之后,两者就没一点关系了,除非用引用,引用过后,形参即实参,对形参做什么处理,实参也会相应改变。或者用第三个方法。
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式