目录
1.函数是什么
2.c语言中函数的分类:
1.库函数
2.自定义函数
3.函数的参数
1.实参
2.形参
4.函数的调用
1、传值调用
2、传址调用
3、传值调用和传址调用的区别
5.函数的定义与声明
函数的定义
函数的声明
6.函数的递归
1、什么是递归
2、递归的两个必要条件
3、举个例子
函数是一个大型程序中的某部分代码,由一个或多个语句块组成,他负责完成某项特定的任务,而且相较于其他的代码,具备相对的独立性。
为什么要用函数?
随着程序的开发,所需要的功能越来越多,其中有些功能是需要重复使用 如果将代码只放在一个函数,会变得越来越复杂,不方便维护进一步开发 所以将不同的功能分为各个函数,即降低复杂度又可以将单一功能重复调用不需要重复编写,在主函数调用。
库函数是c语言库内已经写好的函数,只要我们引入相应的头文件就可以直接使用。下面是几个常用的c语言中库函数的例子
常见的库函数https://blog.csdn.net/qq_74310471/article/details/128718762?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169854288716800186576107%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169854288716800186576107&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128718762-null-null.142^v96^pc_search_result_base9&utm_term=%E5%B8%B8%E8%A7%81%E7%9A%84%E5%BA%93%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187
不同的头文件中包含了不同类型的库函数。如果想要使用库函数,就要将对应的头文件引入程序中,引入头文件等于将头文件所包含的所有库函数导入程序中,这时就可以直接调用库函数。
#include<文件名>
其中<> 可以用英文双引号代替
#include"文件名"
在引入头文件的时候结尾不能加分号
库函数虽然已经十分强大,能够完成很多业务功能,但是仍然无法满足复杂的问题,所以自定义函数是十分重要的,毕竟如果库函数能干所有的事情,那还要程序员干什么?
函数主要包括:
调用函数是通过语句实现的。函数名、小括号与分号组成调用函数语句。
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
注意:实参和形参的名字可以不一致!
传值调用的时候,实际参数和形式参数分别占用不同的内存单元(地址不同),故形式参数和实际参数之间没有任何联系。
传址调用是把函数外部定义的变量的地址传给函数,这种传参方式就可以做到在函数内部对函数外部的变量进行修改,因为通过变量的地址就可以找到对应的变量。
举一个例子来说明一下,函数传值调用和传址调用的区别
比如我们现在要写一个函数,我们希望调用这个函数后能将两个变量的值进行转换
错误示范:
通过结果我们可以看出两个变量的值并没交换,这是因为函数内部的变量与外部的变量没有任何关系,实际交换的只是函数内部的变量。
正确写法:
我们可以看到,当我们把参数改成地址(指针)的形式时,就交换成功了,这恰恰说明了传址调用可以在函数内部对函数外部的变量进行修改。
函数的定义就是交代这个函数的具体实现步骤或功能,但要注意的是函数不能嵌套定义,就是在一个函数里面不能再定义另一个函数
错误示范:
int max(int a1, int b1) {
return a1 > b1 ? a1 : b1;
int min(int a2, int b2) {
return a2 < b2 ? a2 : b2;
}
}
正确定义:
int max(int a1, int b1) {
return a1 > b1 ? a1 : b1;
}
int min(int a2, int b2) {
return a2 < b2 ? a2 : b2;
}
return的类型必须和返回值类型一致
递归是程序直接或间接调用自身的编程技巧(recursion)
递归是一种方法,它通常可以把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决,递归只需要少量代码就可以完成,大量的重复多次计算,大大减少了代码量。
递归的主要思考方式在于:把大事化小
——递归结束的条件,当满足这个条件之后,递归就不再继续。
——每次递归调用结束越来越接近这个条件。
例如我们现在要写一个函数,帮我们顺序打印一个整数的每一位
例如
输入:12345
打印:1 2 3 4 5
思路:
我们如果想要得到一个数字的每一位,我们需要先%10得到最后一位,后/10除去最后一位,因为/10最后一位为余数,可以继续向前查找,直到这个数字成为一个一位数停止程序(因为如果这里是个一位数,a/10的值就是0,我们并不想打印0的每一位),所以在这里我们定义一个函数f(),它可以按顺序打印每一个值。
这个函数实际上的调用顺序是:
f(12345) f(1234) f(123) f(12) f(1)
每一个函数实际上打印的都是最后一位,而且函数调用是后调用的函数先结束,所以打印的顺序就是1 2 3 4 5