目录
一、什么是函数
数学中我们常见到函数的概念。但是你了解C语言中的函数吗?
维基百科中对函数的定义: 子程序
- 在计算机科学中,子程序,是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成一项特定任务,而且相较于其他代码,具备相对的独立性。
- 一般会有输入参数,并且带有返回值,提供对过程的封装和细节的隐藏。
二、C语言中函数的分类
- 库函数
- 自定义函数
1.库函数
为什么会有库函数?
1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。
2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。
3. 在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。
像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
简单的总结一下,C语言常用的库函数有:
- IO函数
- 字符串操作函数
- 字符操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
- 其他库函数
注意:使用库函数,必须包含#include对应的头文件!
2.自定义函数
如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
三、函数的参数
1.函数的实参
真实传给函数的参数叫做实参
实参可以是常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便将这些值传给形参。
2.函数的形参
- 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
- 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
四、函数的调用
1.传值调用
实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。
2.传址调用
实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。
举个例子
写一个函数可以交换两个变量的值
这个例子所展示的就是传值和传址的区别
swap1是传值调用,实参a,b和形参x,y使用的不是同一块内存空间,虽然形参拥有了和实参一模一样的内容,但是分别占用了不同的内存块,此时形参相当于实参的一份临时拷贝,对形参的修改不会影响实参;
而swap2是传址调用,形参里面放的是实参的地址。这种传参方式可以让形参和实参建立起真正的联系,此时对于形参的修改可以改变函数外部的实参。
五、函数嵌套调用和链式访问
嵌套调用
嵌套调用就是在一个函数的内部调用另一个函数
对于函数调用这块内容要注意的是,函数可以嵌套调用,但是不可以嵌套定义
链式访问
链式访问就是:把一个函数的返回值作为另一个函数的参数。
举个好玩例子
printf("%d",printf("%d",printf("%d",43)))
这里会在屏幕上打印什么呢?
这里会打印:4321
这是为什么呢?
因为:printf()函数的返回值是打印在屏幕上字符的个数。
六、函数递归
什么是递归?
程序调用自身的编程技巧叫做递归。
递归作为一种算法在程序设计语言中广泛应用。
一个过程或函数在其定义或说明有直接或间接调用自身的一种方法,他通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量程序就可描述出解题过程所需的多次重复计算,大大减少了程序的代码量。
递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件
举个递归的小例子
计算n的阶乘
结束语
C初阶——函数的部分就到此就结束咯,当中的代码大家都可以敲一敲感受一下哦。感觉有所收获的铁汁们给笔者来个三连吧,感谢喔。