快参加国二C语言的考试了,有一个关于函数的参数传递问题没弄懂,请各位大虾帮我解决一下,压上最后全部财

[复制链接]
查看11 | 回复4 | 2011-2-12 11:32:15 | 显示全部楼层 |阅读模式
#include
void exchange(int x,int y)
{int t;
t=x;
x=y;
y=t;
}
main()
{int a,b;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
exchange(a,b);
printf("a=%d,b=%d\n",a,b);
}
运行程序如下:
Input a,b:6,9
a=6,b=9
为什么形参的交换不能引起实参的变化呢?另外教材写了两个原因:
1.实参和形参各占有不同的存储单元。所以在被调函数中若改变了形参的值,并不会影响实参的值。实参和形参允许同名,不会混淆。
2.由于形参和实参都是局部变量,作用域仅限于各自的函数体,即使形参和实参同名,二者也互不干扰。
请问上述两个原因是什么意思,我没看懂啊,还是有其他的原因啊,本人自学的C语言,基础比较薄弱,请各位大虾详解,谢谢啦~

回复

使用道具 举报

千问 | 2011-2-12 11:32:15 | 显示全部楼层
我来说吧:第一个原因是主要原因;第二个是告诉你,不同函数里可以用相同命名的参数。我主要解释下1吧:代码编译时,a、b、x、y会得到各自的地址,就是存放各自值的地点。你main函数里的变量a、b的地址假如分别是0x0000和0x0001,当你在main里调用exchange(a,b)时,该函数只是把a,b的值传给了exchange里的x、y,而x、y的地址是0x0002、0x0003,也就是说接下来的交换操作是针对0x0002、0x0003这两个地址上的值来执行的。等你执行完该函数后,0x0002(x)与0x0003(y)的值交换了,但0x0000(a)与0x0001(b)的值并没有交换。所以如果你想交换a和b的值,你就必须保证你的excha
回复

使用道具 举报

千问 | 2011-2-12 11:32:15 | 显示全部楼层
这位同学你好 是这样的,C语言里面只允许实参的变量向形参传递,而不允许形参的值反向传递回实参。 所以你这道题里面输入的实参a=6,b=9分别传给了形参x,y。 但是在你的exchange函数中x,y值互换以后它们的值就不能再传回给a,b了~
所以a,b的值不会改变。
具体实现这个程序的话可以用指针来实现,用地址的交换来改变a,b的值。 你明白
回复

使用道具 举报

千问 | 2011-2-12 11:32:15 | 显示全部楼层
因为此处的参数传递是值传递,函数内用的变量只是外部变量的一个拷贝,存放在不同的内存单元中,exchange()只作用在了拷贝上,对原变量无影响,并且这个拷贝在函数退出时被清除。要实现对外部变量的操作,可以用“引用”或者“指针”:引用:#includevoid exchange(int &x,int &y){int
回复

使用道具 举报

千问 | 2011-2-12 11:32:15 | 显示全部楼层
如果需要a,b相互交换,必须使用取址符&,这样才能保证实参a,b真正的交换了,如果没有取址符,a,b的效用也这能停留在exchange函数体内,不能在main函数里面生效,因此,在main中显示a和b也就是原来的数值了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行