目录
一、函数是什么?
函数是完成特定任务的独立程序代码单元。
二、C语言中函数的分类
1.库函数
为了支持可移植性和提高程序的效率,C语言的基础库提供了一系列类似的函数,方便程序员进行软件开发。
C语言常用的库函数:IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期函数、数字函数、其他函数库。
认识学习库函数的网站:
https://en.cppreference.com(英文版)
https://zh.cppreference.com(中文版)
MSDN
使用库函数必须包含相对应的头文件
2.自定义函数
自定义函数同库函数一样,有函数名、返回值类型、函数参数。
函数的结构组成:
ret_type fun_name(para,1 * )
{
statement;// 语句项
}
ret_type 返回类型
fun_name 函数名
(para,1 * ) 函数参数
例1:写一个函数可以找出两个整数中的最大值。
例2:写一个函数可以交换两个整型变量的内容。
注:Swap1与Swap2的区别在于,取地址,涉及指针的内容。
3.函数参数
形式参数(形参):函数名后括号中的变量,形参只有在函数被调用的过程中才实例化(分配内存),函数调用完成后自动销毁,形参只在函数中有效。
实际参数(实参):真实传递给函数的参数。实参可以是常量、变量、表达式、函数等。
如例1中,a,b是实参,x,y,z是形参。
三、函数调用
1.传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
2.传址调用
把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,即函数内部可以直接操作函数外部的变量。
3.四个例题
例1:写一个函数可以判断一个数字是不是素数。
注:出现两个return的原因:因为此处的return,只能返回一个值,要么返回1.要么返回0,不会同时返回两个值。
例2:写一个函数判断是不是闰年。
注:1.&&相当于集合里的交集,|| 相当于逻辑“或” 。初学者需注意括号问题。
2.对函数进行定义的时候,例如" int is_leap_year(int n) ",如果漏写int,写成" is_leap_year(int n) ",会默认为是int类型。但是漏写和" void is_leap_year(int n) "是不同的,void是写了类型,但不需要返回,是空类型的意思。
例3:写一个函数, 实现一个整形有序数组的二分查找。
例4:写一个函数,每调用一次这个函数,就会将num的值增加1。
注:如果想在函数内部改变函数外部的某些变量时,可能需要传址调用。
四、函数的嵌套调用和链接访问
函数与函数之间的有机结合。
1.嵌套调用
函数定义的时候不能嵌套定义,但可以嵌套调用。
2.链式访问
把一个函数的返回值作为另外一个函数的参数。
例1:
例2:
例3:
这个输出结果基于函数的性质:
返回值
这些函数返回打印的字符数,如果发生错误,则返回负值。
所有先输出43,43是2个字符,返回值是2,输出2,2是1个字符,返回值是1,输出1。
此处的点在于,输出值与返回值不同。
五、函数的声明和定义
代码是从前往后扫描的,当函数的定义在后时,需要进行函数声明。
1.函数声明
(1)告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是否存在,无关紧要。
(2)函数的声明一般出现在函数的使用之前,满足先声明后使用。若函数定义出现在函数调用之前,则无需声明,因为函数定义本质是是一种更有力的声明。
(3)函数的声明一般放在头文件中。
2.函数定义
函数定义是指函数的具体实现,交代函数的功能实现。
六、函数递归
1.什么是递归?
程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。
递归的主要思考方式在于:把大事化小。
2.递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
注:这两个条件属于充要条件,程序必须满足这两个条件,但是满足这两个条件的程序不一定正确。
3.四个例题
例1:
具体过程:
例2:编写函数不允许创建临时变量,求字符串的长度。
具体过程:
注:此处使用“'str+1”,而没有使用str++或++str的原因是,前者先使用,后递增,后者先递增后使用,无论如何易改变str的值,此处还是使用str+1比较好。(在递归中,尽量不要使用++这类符合。)
例3: 求n的阶乘(不考虑溢出)
例4:求第n个斐波那契数
斐波那契数指的是这样一个数列:0、1、1、2、3、5、8、13、21、……列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。