刚学 C 语言的朋友,是不是经常被函数的参数和返回值搞得晕头转向?比如参数传进去了,函数里改了半天,外面还是老样子;或者返回值明明算对了,拿到手却变成了奇怪的数字。这些问题啊,几乎每个新手都会碰到。今天兔子哥就跟大家好好聊聊函数的参数和返回值,把那些容易掉进去的坑都扒出来,再说说怎么避开它们。毕竟 “C 语言函数参数怎么用”“返回值错误怎么办” 这些,都是大家常搜的问题,得讲清楚才行。
先说说参数这回事。函数的参数,就像咱们给别人递工具,你递啥,人家就用啥。但参数也分好几种,最常见的就是值传递和地址传递,这俩差别可大了,咱们用个表格对比下:
| 类型 | 特点 | 改了参数影响外面吗 | 适合用啥场景 |
|---|---|---|---|
| 值传递 | 把数值复制一份给函数 | 不影响 | 简单计算,比如求和 |
| 地址传递 | 把变量的地址给函数 | 会影响 | 要修改原变量,比如交换两个数 |
比如说,你想写个函数交换两个整数,要是用值传递,函数里确实交换了,但原来的两个数根本没变,这时候就该用地址传递,把变量的地址传进去,这样才能真正交换成功。我们在使用的时候,可别搞混了,不然代码跑起来结果肯定不对。
再说说传递参数时的坑。第一个大坑就是参数类型不匹配。比如函数定义的是 int 型参数,你却传了个 float 型进去,编译器可能不会报错,但算出来的结果能让你怀疑人生。所以每次调用函数前,都得看看参数类型对不对,是不是一一对应。
第二个坑是传数组的时候忘了长度。数组作为参数传递时,其实传的是首地址,函数里并不知道数组有多长。这时候如果自己不记录长度,很容易越界访问,程序可能直接崩溃。所以最好的办法是,把数组长度也作为一个参数传进去,这样就安全多了。
还有啊,参数太多的时候容易搞混顺序。比如一个函数要传姓名、年龄、成绩,顺序一错,年龄当成成绩传进去,那数据就全乱了。兔子哥建议,参数多的时候,调用之前最好在心里过一遍,或者写注释记下来,别嫌麻烦,总比找 bug 强。
接下来聊聊返回值。返回值就是函数干完活给我们的结果,这个结果也有不少讲究。首先,返回值的类型得和函数定义的一致。定义的是 int 型,就不能返回个字符串,不然编译器会发脾气的。
这里有个超级大坑,就是返回局部变量的地址。局部变量是在函数里临时创建的,函数一结束就被销毁了,它的地址也就没用了。这时候你返回这个地址,外面用的时候,拿到的可能是乱七八糟的数据,甚至会让程序崩溃。所以啊,千万别返回局部变量的地址,要是真需要返回地址,得用 static 修饰变量,或者用动态分配的内存,不过动态分配的记得释放,不然又会有内存泄漏的问题。
有人可能会问,函数能不能没有返回值?当然可以,这时候函数定义的时候用 void 就行,比如只是打印个东西的函数,不需要返回啥,就可以写成 void printInfo ()。但要是函数定义了有返回值,那就必须得有 return 语句,不然也会出问题。
咱们再自问自答几个核心问题。为什么有时候函数里改了参数,外面却没变?那肯定是用了值传递,函数里改的是复制过来的那份,跟原来的没关系,想改原来的就得用地址传递。那返回值能不能同时返回多个呢?直接返回是不行的,一个函数只能有一个返回值。但可以用指针,通过地址传递的方式,在函数里修改多个变量,这样就相当于间接返回多个结果了。
还有个小细节,就是函数声明的时候,参数名可以省略,只写类型就行,但定义的时候必须写全。比如声明可以写成 int add (int, int); 但定义必须是 int add (int a, int b) { ... }。这个虽然影响不大,但不注意的话,有时候也会让人 confusion。
最后兔子哥说点自己的心得。参数和返回值这东西,看着简单,实际用的时候坑真不少。最好的办法就是多写代码,多调试,碰到问题别慌,一步一步找原因。比如参数传错了,就打印出来看看函数里拿到的是啥;返回值不对,就检查 return 语句前后的计算过程。刚开始慢没关系,练多了自然就熟了,避坑的技巧也都是从踩坑里总结出来的嘛。希望这些能帮到正在学 C 语言的朋友,有啥问题咱们也可以一起讨论讨论。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~