免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3219 | 回复: 10
打印 上一主题 下一主题

[C] 新手请教关于函数的参数问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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?)中会有声明实参和形参两种,而这两种的区别就在于传递参数的时候,是传递值,还是传递内存地址,如果只是值传递,那么原始的变量将不受影响,如果是内存地址传递,那么由于原始的变量也指向的是同一个地址,所以也会被改变。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
2 [报告]
发表于 2011-05-13 12:01 |只看该作者
你还是去买一本C程序设计语言吧,200来页,二十来块钱,不缺那么一点钱

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 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

论坛徽章:
0
4 [报告]
发表于 2011-05-13 12:06 |只看该作者
你的理解是对的

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2011-05-13 12:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-05-13 13:01 |只看该作者
回复 2# egmkang


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

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
7 [报告]
发表于 2011-05-13 13:55 |只看该作者
回复 6# sfrost

呵呵

论坛徽章:
0
8 [报告]
发表于 2013-01-11 16:43 |只看该作者
不会发生改变。函数调用只是简单的单向值传递,并不能能够修改原值。如果想要达到修改的目的,可以使用指针

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2013-01-11 16:45 |只看该作者
挖坟              

论坛徽章:
0
10 [报告]
发表于 2013-01-11 17:12 |只看该作者
你的理解是正确的。C语言函数参数形式有:传值和传指针两种。传值的话形参与实参结合的时候,形参需要创建临时变量保存实参的值,函数执行过程中是对形参操作的,实际参数没有改变。
对于指针参数,对应的是实参的地址,操作地址的话才能改变实际的参数。另外也可以用引用,也可以达到这种效果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP