一.什么是函数
①函数是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
②一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
二.C语言中函数的分类
1.库函数
2.自定义函数 :自己创造的函数
2.1库函数
2.1.1为啥会有库函数?
当我们在C语言编程的过程中,我们经常需要在编写完一段代码之后在屏幕输出它的结果,这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf函数)。
像这样的基础功能的代码有很多,为了提高程序员的开放效率,避免重复造轮子这一过程,我们将常用的函数功能封装在一个个仓库里,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
2.1.2 C语言常用的库函数都有:
- IO函数
- 字符串操作函数
- 字符操作函数
- 内存操作函数
- 时间/日期函数
- 数学函数
- 其他库函数
//使用库函数,必须包含 #include 对应的头文件
2.2自定义函数
库函数不能完成所有事情,所以自定义函数很重要
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
函数组成
ret_type fun_name(para1, * ) { statement;//语句项 } ret_type 返回类型 fun_name 函数名 para1 函数参数
例子1:写一个函数找出两个整数的最大值
例子2:写一个函数交换两个整型变量的内容。
定义两个变量,输入不同的整数,我们想要的结果是两个变量的数字交换了。我们创建函数
swap。 交换两个变量需要再创建一个新的变量z,将x的值放入z,然后y的值放入x,最后将z的值放入y。
//创建的swap函数,目的交换两个整型变量的值 void swap(int x, int y) { int z = 0; z = x; x = y; y = z; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d b=%d", a, b); swap(a, b); printf("交换后:a=%d b=%d", a, b); return 0; }
下一步在编译器进行编译,我们输入 3 和 5。
我们发现调用swap函数,a和b的值并没有发生交换。我们进行调试,打开监视窗口寻找原因。
我们发现变量a、b与对应x、y的地址不一样,同时拥有了和实参一模一样的内容。
a和b叫实参,xy是形参,当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝,所以对形参的修改,不会影响实参。
那么我们应该怎么修改才能使这个代码能完成我们的需求呢?
我们需要让变量a和b与函数参数之间产生联系,我们只需要将变量的地址传给函数就行。
我们知道指针变量指向的是它所指向变量的地址,改变指针变量的值,也能改变它指向那个变量的值。那么我们对swap函数就行修改,将变量的地址传给函数。
void swap2(int* pa, int* pb) { int z = *pa; *pa = *pb; *pb = z; }
我们将a的地址传给pb,b的地址传给pb。*pa就是a,*pb就是b。最后编译的结果与我们符合我们的需求,函数创建成功。
3.函数的参数
3.1实际参数 (实参)
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
3.2形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
4.函数的调用
4.1传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
4.2传址调用:
①传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
② 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
5. 函数的嵌套调用和链式访问
5.1函数的嵌套调用
如图mian函数调用了一个one_function函数,而one_function函数又调用了two_function函数,最终打印出two_function函数中的haha,这类过程就称为函数的嵌套调用。
5.2函数的链式访问
把一个函数的返回值作为另一个函数的参数。
6.函数的声明和定义
6.1 函数声明:
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的。6.2 函数定义:函数的定义是指函数的具体实现,交待函数的功能实现。
7.函数递归
7.1什么是递归
函数自己调用自己。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
7.2递归的两个必要条件
①存在限制条件,当满足这个限制条件的时候,递归便不再继续。
②每次递归调用之后越来越接近这个限制条件。