一、函数
C语言里可以对语句进行分组,每个语句分组叫做一个函数
一旦函数被调用,会执行该函数所表示的语句分组
1.1 函数的调用
代码语言:javascript复制int main(void){
printf("hello,worldn");
return 0;
}
- 函数调用 - 使用已经定义好的函数
- 被使用的函数称为被调用函数 - printf函数
- 使用被调用函数的函数被称为调用函数 - main函数
1.2 函数调用的本质
三步骤:
- 跳转
- 执行
- 返回(从哪儿跳转,到哪儿返回)
1.3 为什么要使用函数
- 明确任何C语言程序都是由两部分组成:
- 一堆的变量(包括数组)和一堆的函数
- 前者负责分配内存,后者负责操作访问内存
- 函数的概念:就是一堆语句的组合,一次写好,到处使用!
- 本质目的:减少开发的工作量,提高代码的可维护性
1.4 函数的返回值
只能从被调用函数向调用函数传递一个数据,这个数据叫做被调用函数的返回值
返回值必须记录在被调用函数的储存区里,编写函数的时候要把这个储存区的类型名称卸载函数名称前面
被调用函数里使用return关键字指定作为返回值的数值
调用函数里要把整个函数调用该语句当作数字使用,这个数字就是被调用函数的返回值
1.5 函数的参数
可以从调用函数向被调用函数传递多个数据,这些数据的类型可以不同
被调用函数需要为每个传递过来的数据提供一个储存区
编写函数的时候需要在函数名称后面的小括号里声明一组变量,这些变量就用来表示前面提到的储存区,这些变量叫做形式参数,小括号里的所有内容叫做形式参数列表
调用带有参数的函数时需要在函数调用语句的小括号里为每个形式参数提供一个对应的数字,计算机 会把这些数字记录到对应的形式参数里。被调用函数可以通过形式参数得到这些数字。这些数字叫做实际参数
只要能当作数字使用的内容,都可以作为实际参数使用。
函数调用过程中通常伴随着两个函数之间的数据传递
数据传递存在两个完全相反的方向
- 可以从被调用函数向北调用函数传递数据-参数
- 可以从被调用函数向调用函数传递数据-返回值
1.5 函数的声明
任何函数都可以分为大括号前面的部分和大括号里面的部分
函数大括号前面的部分可以单独写成一条语句,这种语句叫做函数声明语句
函数声明语句里可以省略形式参数名称
把函数声明语句卸载文件开头叫做函数的显式声明
除了主函数以外的所有函数都应该进行显式声明
格式:extern 返回值类型 函数名(形参列表)
函数的定义在函数的调用前面,可以省略函数声明
二、递归函数
2.1 什么是递归函数
C语言里函数可以调用自己,自己调用自己的函数叫递归函数
2.2 递归函数编写步骤
- 单独编写语句解决分解后的每个小问题(假设递归函数已经可以使用了)
- 在递归调用语句前编写分支处理不可分解的情况(这种分支必须要能结束函数)
三、作用域和生命周期
能使用某个变量的所有语句叫做变量的变量的作用域
生命周期是一段时间,在生命周期开始的时候计算机给程序分配储存区,在生命周期结束的时候,计算机把分配给程序的储存区收回
3.1 局部变量
局部变量是定义在函数内的变量
- 作用域:定义的位置开始到函数结束
- 生命周期:函数某一次执行的时间范围
3.2 全局变量
全局变量是定义在函数外的变量
- 作用域:从定义的位置开始向下的所有语句
- 生命周期:整个程序的执行时间
3.3 作用域和生命周期
局部变量(静态局部变量)
区别:静态局部变量的生命周期是整个程序的执行时间
全局变量(静态全局变量)
区别:静态全局变量无法被其他文件调用
- 静态变量的生命周期和作用域与普通变量的不一样,静态变量的生命周期是整个程序执行时间
- 声明静态变量的时候需要使用static关键字
- 没有初始化的静态变量会自动被初始化成0
- 函数结束后,静态局部变量的储存区也还是可以使用
- 静态局部变量的作用域仍然只包含函数里面的所有语句
- 静态变量的初始化只在程序开始的时候执行一次,不论初始化语句写在什么地方
- 静态全局变量的生命周期还是整个程序的执行时间,但是它的作用域只包含声明它的文件里的所有语句(不可以跨文件使用静态全局变量)