通过传送地址值,直接在被调用函数中直接改变实参。是怎么改变的?

麻烦结合以下算法,讲解一下实参是如何改变的,改变过程。实参是怎么改变的?在哪里改变了?不是说从实参到形参的值是单向传递吗?不是说形参不能改变实参吗?这为什么又改变了,怎么... 麻烦结合以下算法,讲解一下实参是如何改变的,改变过程。实参是怎么改变的?在哪里改变了?
不是说从实参到形参的值是单向传递吗?不是说形参不能改变实参吗?这为什么又改变了,怎么个改变法?
请说的通俗一些,感激不尽

#include<stdio.h>
void swap(int*,int*)

main()
{
int x=30,y=20:
printf("(1)x=%d y=%d\n"x,y):
swap(&x,&y)
printf("(4)x=%d y=%d\n"x,y):
}

void swap(int*a,int*b)
{
int t:
printf("(2)x=%d y=%d\n"x,y):
t=*a:*a=*b:*b=t:
printf("(3)x=%d y=%d\n"x,y):
}

输出结果
(1)x=30 y=20
(2)x=30 y=20
(3)x=20 y=30
(4)x=20 y=30
能不能讲解一下swap函数里的变量值是怎么传递到主函数的,求过程,通俗点说或者画个图什么的告诉我主函数里的xy怎么改变的,麻烦了
展开
 我来答
yuantailing
2013-07-17 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:642万
展开全部

确实是只能单向传递(在C语言),不矛盾。

如果直接传值(void swap(int a,int b)),那么无论在函数里如何修改这个值,都修改的是函数里那个变量的值,不会影响外面。

如果传地址(void swap(int*a,int*b)),那么函数拿到这个地址就可以修改这个内存地址中的数据,退出函数后原来变量的内存地址中的数据就改变了。


所以,swap函数里的变量值无论如何都传递不到主函数的,传址的时候是通过地址修改了主函数里的数据。


附图1,传值为什么改不了


附图2,传址为什么能改

虔诚且清冽灬雏菊8582
2013-07-17 · TA获得超过342个赞
知道小有建树答主
回答量:205
采纳率:0%
帮助的人:146万
展开全部
swap是典型的解释指针用法的教科书例子。。。

如果不用指针,则swap函数的作用仅限于函数内。。。swap(int a,int b)中的a,b的作用域只在函数内,在函数外部是看不到的,a=x,b=y时,传递的是x,y的值,a,b的值改变了,但x,y的值没有变,而函数返回只能返回一个对象,不能同时返回两个对象,也无法把改变后的a,b同时赋值回给x,y。所以在这里是无法实现函数功能的。。。

而swap(int* a,int* b)中a是指针变量,记录的是一个内存地址,a=&x的意思是取x变量的内存地址给a,这样a和&x是同一个地址,*a和x是同一个实际内容的两个名字。。。操作*a就等于操作了x。。。

呃,通俗点的解释就是:
值传递等于克隆,再造了一个和你一模一样的人,但是把那个人怎么操作,对你本身也没影响。。。
指针传递等于给你取了一个新名字,把这个新名字代表的人进行操作,实际就是对你本身进行操作。。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友59342257e
2013-07-17 · TA获得超过509个赞
知道小有建树答主
回答量:401
采纳率:50%
帮助的人:212万
展开全部
关键是传指针或者引用,还是传值,前三个就不说了,不管传指针还是引用,都是这个结果,关键是(4)的输出,因为你传的是指针,所以,在函数内部,变量的值变了,在函数外部有效,如果你去掉*指针标志,估计就还是输出x=30,y=20
追问
能不能讲解一下swap函数里的变量值是怎么传递到主函数的,求过程,通俗点说或者画个图什么的告诉我主函数里的xy怎么改变的,麻烦了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式