C语言2级,形参与实参之间的问题

#include<stdio.h>viodfun(int*a,int*b){int*c;c=a;a=b;b=c;}main(){intx=3,y=5,*p=&x,*p=&... #include<stdio.h>
viod fun(int *a,int *b)
{ int *c;
c=a;a=b;b=c;
}
main()
{ int x=3,y=5,*p=&x,*p=&y;
fun(p,q);
printf("%d%d",*p,*q);
fun(&x,&y);
printf("%d%d",*p,*q);
}
第一次使用被调函数fun,指针之间交换的是什么?
第二次使用被调函数fun,参数x与y的值为什么没有被交换?
展开
 我来答
默默狼狼
2013-01-21
知道答主
回答量:30
采纳率:0%
帮助的人:26万
展开全部
viod fun(int *a,int *b)用指针作参数,传进去的是地址,这个只是传值调用,不会改变实参的值,如果要改变实参的值,要把地址里面的数交换才行,即函数里面应该改为int c,c=*a,*a=*b,*b=c,这样就行了,按你的写法你前后两次传进去的都是x,y的地址,但是没有交换地址里面的值,只是交换了地址,只交换地址就是当做传值调用而已。不是引用调用啊!
追问
传值调用是把值传给形参,也就是a与b,但是p与q的值没有改变。在推出fun函数时a与b的值就消失了。这样理解对吗?
追答
嗯,可以这样说,传值调用就是把一个数据复制一份给形参,但数据所在的地址没有涉及到,所以,你退出程序的时候没有改到这个地址存放的数据,数据自然就没有变化,因为 ,你p和q是指针,本身是指向的地址,但是你更改的时候没有改动的他指向的地址的内容,所以就理解为传值调用,而不是引用调用,引用调用是形参前面是要加&这个符号的。。。c最难的就是指针,慢慢理解就好多了,刚开始学的时候都是这样,不过传值调用和引用调用一定要弄清楚差别在哪里。。
百度网友e651196
2013-01-21 · TA获得超过141个赞
知道小有建树答主
回答量:156
采纳率:0%
帮助的人:151万
展开全部
viod fun(int *a,int *b)
{ int *c;
c=a;a=b;b=c;
}
a, b 都是临时变量 交换临时变量的值是没有意义的
这确的做法是
void fun(int **a, int **b)
{
int *c = *a; *a=*b; *b=c;
}

fun(&x,&y);

这样x和y就被交换了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
木是多多人
2013-01-21 · 超过13用户采纳过TA的回答
知道答主
回答量:56
采纳率:57%
帮助的人:10.9万
展开全部
首先我先说明我的的理解很奇怪,
但是能解释这一类的问题;

两个交换的内容其实是一样的。都是数值,不是地址;
*是指向地址符(应该是这么叫,但是作用是这个没有错。)
你将fun(int *a,int *b)在调用时候分步骤来看,比如第一个调用,写的是fun(p,q),p,q,里面存的是地址,所以前面再加上*号那就是表示用这个地址所指向的数值来进行交换,所以X,Y的值没有交换!
不懂再继续问。
追问
为什么p,q所指向的地址里面的值没有发生改变呢?不是叫他们交换吗?
我的理解是他们的确发生了交换,只是在fun用户定义函数里面,定义了一个新的形参,而形参的值发生了改变,在main函数里面形参失去意义,实参的值还是为被fun函数调用前的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
张俊瑞777
2013-01-21 · 超过13用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:30.8万
展开全部
改正代码:
第二行:void
第七行:int x=3,y=5,*p=&x,*q=&y;

两次都没交换吧,自己运行看过了。

你的fun函数只是交换了形参a,b的值。

要互换*q,*p 的值,要么交换他们所指向的x,y 的值,要么交换q,p 指针的指向。
修改方案一:交换他们所指向的x,y 的值
viod fun(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}
修改方案二:交换q,p 指针的指向。

viod fun(int **a,int **b)
{ int *c;
c=*a;*a=*b;*b=c;
}
main()
{
int x=3,y=5,*p=&x,*p=&y;
fun(&p,&q);
printf("%d%d",*p,*q);

}
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友4fa72e4
2013-01-21 · TA获得超过121个赞
知道答主
回答量:46
采纳率:0%
帮助的人:14万
展开全部
理解 同上
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式