零基础通关C语言——chapter7——走进函数

前言:

hello,大家好呀,我是Humble

今天我们来聊一聊函数

这个东西其实我们在写第一个C程序就一直在用了

那么今天我们来稍微详细的介绍一下它

关于函数的概念,在数学中我们对此并不陌生,比如:一次函数 y=kx+b 

而C语言也引入了函数(function)这个概念,函数还有一种翻译 :子程序 其实这种翻译更加的贴切这个概念 


因为C语言中的函数就是一个完成某项特定的任务的一小段代码,这段代码有着特殊的写法和调用方法

在C语言中我们一般会见到两类函数:
1.库函数
2.自定义函数

下面我们先来看看库函数吧

一.库函数

我们前面内容中学到的 printf 、 scanf 都是库函数,这些函数已经是现成的,我们只要学会就能直接使用了

有了库函数,一些常见的功能就不需要程序员自己实现了,一定程度提升了效率;同时库函数的质量和执行效率上都更有保证

在我们编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明

因此我们在调用库函数时,只要对其头文件进行声明便能使用啦

既然库函数有这么多,我们在哪可以学习它们呢?

其实这类查看工具有很多,这里给大家推荐一个叫 cplusplus.com的网站

这是网址:https://legacy.cplusplus.com/reference/clibrary/

注意,(插句题外话)虽然这是个英文界面的网站,但我们编程是肯定要跟英语打交道的,所以大家千万不要对它产生排斥心理。随着我们阅读的增加,我们看英文也会变得越来越轻松,欸,说不定四六级都因为这个通过了(笑)

说了这么多,接下来以 sqrt 这个函数来举例一下这个函数的用法

881516bc9762432088956b33e8a5af32.png   我们搜索到这个函数,映入我们眼帘的标题就是这个函数的名字

                                                   

                                                       接下来则是正文

首先,我们看到的是这个我们要查看函数的原型

对于sqrt函数来说就是这个

b2f5462882a84518846da2c93a40e57a.png

然后下面就对函数功能进行介绍,对于sqrt函数来说就是这个

8368633f7ba54a028d200c46ae9cecf4.png

中文为  计算平方根,返回x的平方根

往下是参数和返回类型说明

c8269491ea5940dc9fc26189849df8d6.png

再往下是实战部分,即代码的举例与其输出

075dbd1d8f5c45aeb4151cf9ee339128.png

注意:库函数的使用务必包含对应的头文件,比如这个sqrt就需要在使用前写上 #include<math.h>

最后,它还有一个相关知识链接的拓展

bd0f321cb7484c398b366b8dee1c218b.png

至此,一份库函数文档阅读完毕!

下面是我根据这份文档总结的关于sqrt函数的用法

661e380faeb3480abd672dc01719a31e.png

这里,我来给大家总结一下这个库函数文档的一般格式

1. 函数原型

2. 函数功能介绍

3. 参数和返回类型说明

4. 代码举例

5. 代码输出

6. 相关知识链接

最后我想告诉大家:库函数的学习不用着急一次性全部学会,我们只需要慢慢学习,各个击破就行

二.自定义函数

当我们了解了库函数之后,我们的关注点就应该聚焦在自定义函数上,自定义函数其实更加重要

下面我们就来学习一下它的用法吧!

1.语法形式

30e42a13aa2447728f8df13c2a5168bf.png

有没有发现,其实自定义函数和库函数的形式差不多,只不过因为这个函数的功能要自己实现,所以多了{ }函数体用来实现功能,所以我们要学会举一反三的学习方式才能使学习事半功倍

2.举例

下面来举个例子,我们用自定义函数来实现2个整型变量的加法操作

4bed7a821cbf4b408e7904ce09665d98.png

三.形参和实参

在函数使用的过程中,把函数的参数分为,实参和形参。 再看看我们前面写的代码

我们是先进行函数的定义,再对函数进行调用

所以我们把调用Add函数时,传递给函数的参数a和b,称为实际参数,简称实参实际参数就是真实传递给函数的参数

而定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参。

为什么叫形式参数呢?

实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x 和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形式的实例化

其实这个现象是可以通过调试观察到的,大家可以尝试一下

下面是我调试的一次结果

cacbe9c1b5d74b449d9062dade35a868.png

我们在调试的可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不一样的,所以我们可以理解为形参是实参的一份临时拷贝

四.return语句

在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项。

1.return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果

2.return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况

3. return返回的值和函数返回类型不一致,系统自动将返回的值隐式转换为函数的返回类型

4. return语句执行后,函数就彻底返回,后边的代码不再执行

5.如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误

五.数组做函数参数

在使用函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进行操作。 比如:写一个函数对将一整型数组的内容,全部置为-1,再写一个函数打印数组的内容

我们先写出主函数,来明晰这段代码的整体架构

3c0f843969894307b33905f0df58c03f.png

而对于这两个函数,我们不妨命名为 set_arr 和 print_arr

我们将数组作为参数传递给了set_arr 和 print_arr 函数,接下来我们来设计一下这两个函数、

示例如下

a09f522681394366866a4c5fc7b3bfd1.png

将这两端拼起来,我们的代码就写完啦!

六.嵌套调用和链式访问

1.嵌套调用

嵌套这个概念我们在讲循环的时候已经讲过了,不知道大家还记得吗,其实嵌套调用就是函数之间的互相调用,下面我们通过一个例子来理解

举例:

假设我们计算某年某月有多少天?,如果要函数实现,可以设计2个函数

1.is_leap_year():根据年份确定是否是闰年

2.get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数

下面是这两个函数的代码示例

fb579546dd7c4e9682ff4eaef0920306.png

下面是主函数

e76a889c13754af19f4c614f65d10609.png

在这个例子中就体现了循环调用的思想

main 函数调用get_days_of_month,然后get_days_of_month 函数调用 is_leap_year

未来的稍微大一些代码都是函数之间的嵌套调用

BUT函数是不能嵌套定义的!!!

2.链式访问

所谓链式访问就是将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问

比如:

我们来看一下下面这个有趣的代码  它执行的结果会是什么呢?

5dc70545959b48aabe8acdc77b12f9f5.png

在看这段代码前,我们得先知道一个关于printf函数返回的知识点

我直接下结论了 : printf函数返回的是打印在屏幕上的字符的个数

然后我们来看上面的这段代码

第一个printf打印的是第二个printf的返回值,

第二个printf打印的是第三个 printf的返回值。

第三个printf打印43,在屏幕上打印2个字符,再返回2 第二个printf打印2,在屏幕上打印1个字符,再放回1 第一个printf打印1

所以结果应该是 4321 运行一下看一下结果吧

13527314a31e473c8713aa98e60fbf1f.png

果然是这样!

所以,将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问

七.课后练习

小乐乐计算函数_牛客题霸_牛客网

牛牛逆序输出_牛客题霸_牛客网

函数实现计算一个数的阶乘_牛客题霸_牛客网

想对C语言基础语法有更多的了解,推荐大家在牛客网这个平台上多多刷题,在线编程哦

下面是牛客网_语法篇_基础语法篇的链接,大家可以在里面找到与目前水平相匹配的题目去做

https://www.nowcoder.com/exam/oj?page=1&tab=%E8%AF%AD%E6%B3%95%E7%AF%87&topicId=290 

结语:

好了今天的分享就到这里了

哦,对了,如果大家觉得博客在哪里需要改正,可以在评论区留言呀,感谢感谢

也希望大家给这个萌新博主点个赞吧(求求)

让我们在接下来的时间里一起成长,一起进步吧!

f9f30f716e7a4d259882d2294937b207.jpg


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃肉的Humble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值