Chinaunix

标题: 新手请教关于函数的参数问题? [打印本页]

作者: sfrost    时间: 2011-05-13 11:59
标题: 新手请教关于函数的参数问题?
最近在看网上到处都有的免费C学习资料《Linux C编程一站式学习》,现在遇到一个习题,网上搜了一下别人作的,和自己的结论不一样,烦请高手指教一下,习题如下:

1、定义一个函数increment,它的作用是把传进来的参数加1。例如:
  1. void increment(int x)
  2. {
  3.         x = x + 1;
  4. }

  5. int main(void)
  6. {
  7.         int i = 1, j = 2;
  8.         increment(i); /* i now becomes 2 */
  9.         increment(j); /* j now becomes 3 */
  10.         return 0;
  11. }
复制代码
我们在main函数中调用increment增加变量i和j的值,这样能奏效吗?为什么?

我的回答:increment函数不会增加变量i和j的值,也就是说变量i和j的值不会有任何改变。
在我有限的编程经验中是这样理解这个例子的:声明的函数increment中的参数x是个形参,在将变量i/j传递给函数increment的时候仅仅是将i/j的数值(实参)复制给参数i,increment函数修改的实际上是变量x所存放的内存地址,改变的是x这个变量的值。
我不知道这样理解是否正确,因为我记得VB(还是PHP?)中会有声明实参和形参两种,而这两种的区别就在于传递参数的时候,是传递值,还是传递内存地址,如果只是值传递,那么原始的变量将不受影响,如果是内存地址传递,那么由于原始的变量也指向的是同一个地址,所以也会被改变。
作者: egmkang    时间: 2011-05-13 12:01
你还是去买一本C程序设计语言吧,200来页,二十来块钱,不缺那么一点钱
作者: nizvoo    时间: 2011-05-13 12:06
最近在看网上到处都有的免费C学习资料《Linux C编程一站式学习》,现在遇到一个习题,网上搜了一下别人作的 ...
sfrost 发表于 2011-05-13 11:59



    參數分爲傳值和傳地址

  1. void foo(int i)
  2. {
  3.   i = i+ 1;
  4. }


  5. void foo2(int* i)
  6. {
  7.   (*i) = (*i) + 1;
  8. }
复制代码
int x, y;

x = 1;

不會改變  x
foo(x)
x=1
會改變x
foo2(x)
x=2
作者: Cu_fans    时间: 2011-05-13 12:06
你的理解是对的
作者: pmerofc    时间: 2011-05-13 12:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: sfrost    时间: 2011-05-13 13:01
回复 2# egmkang


非常感谢3#、4#、5#的朋友,谢谢你们的回答,幸好我之前有过编程经验,不然又会被网上的一些错误的答案误导。
至于2#这位朋友的态度,不作评论。
作者: egmkang    时间: 2011-05-13 13:55
回复 6# sfrost

呵呵
作者: qiyuefeng11    时间: 2013-01-11 16:43
不会发生改变。函数调用只是简单的单向值传递,并不能能够修改原值。如果想要达到修改的目的,可以使用指针
作者: hellioncu    时间: 2013-01-11 16:45
挖坟              
作者: elegant87    时间: 2013-01-11 17:12
你的理解是正确的。C语言函数参数形式有:传值和传指针两种。传值的话形参与实参结合的时候,形参需要创建临时变量保存实参的值,函数执行过程中是对形参操作的,实际参数没有改变。
对于指针参数,对应的是实参的地址,操作地址的话才能改变实际的参数。另外也可以用引用,也可以达到这种效果。
作者: haryer    时间: 2013-01-11 17:19
较之函数的指针参数,传个引用进去的方法,这样也少产生个临时指针变量了~~效率较高




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2