C语言中的函数就是一个完成某项特定的任务的一小段代码
1.库函数
1.1标准库和头文件
库函数也是函数,是一些已经是现成的函数,我们需要学会直接使用就可以了,这些库函数根据功能的划分都在不同的头文件中进行了声明
库函数的学习和查看工具
库函数相关头⽂件:
https://zh.cppreference.com/w/c/header
cplusplus.com:
sqrt的举例
double
sqrt (
double
x)
函数名
函数的参数,表示调用函数需要传递一个double类型的值
返回值类型,表示函数计算的结果是double类型的值
1.2头文件包含
库函数是在标准库中对应的头文件中声明的,库函数的使用,务必包含对应的头文件
2.自定义函数
自定义函数的形式
ret_type fun_name( 形式参数)
ret_type fun_name( 形式参数)
函数返回类型
函数名
{
函数体(完成计算的过程)
}
3.形参和实参
在函数使用的过程中,把函数的参数分为实参和形参
实参:真实传递给函数的参数
形参(函数名后面的参数):只是形式上存在的,不会向内存申请空间,不会真实存在,所以叫做形式参数
1:形参和实参各自是独立的内存空间,我们可以理解为
形参是实参的一份临时拷贝
2:数组在传参的时候,实参就写数组名就行,形式也是数组的形式(数组在传参时写函数名)
3:实参和形参的名字可以是一样的
4:数组在传参的时候,形参的数组和实参
4.return语句
1)return语句后面可以是一个数值,也可以是一个表达式(先执行表达式,再返回表达式的值)
2)return语句后面可以什么都没有,直接一个return(这种写法适合函数返回类型是void的情况)
3) return返回的值和函数返回类型不一致,系统会自动会将返回的值隐式转换为函数的返回类型
4)return语句执行后,函数就彻底返回,后边的代码不再执行
5)如果函数中存在if等分支的语句,则要保证每种情况下都有返回值,否则会出现编译错误
5.数组做函数参数
难免会有将数组作为参数传递给函数,在函数内部进行操作的情况
1.函数的形参要和函数的实参个数匹配
2.函数的参数是数组,形参也可以是写成数组的形式
3.形参如果是一维数组,数组的大小可以不写,二维数组时,行可以省略,列不能省
4.数组传参,形参是不会创建新的数组的
5.形参操作的数组和实参的数组是同一个数组
6.嵌套调用和链式访问
嵌套调用就是函数的互相调用,来写出相对大型的程序
链式访问:将一个函数的返回值作为另外一个函数的参数
![](https://i-blog.csdnimg.cn/blog_migrate/30018d44e975531f451835f9a0763b6a.png)
有意思的代码
1.
![](https://i-blog.csdnimg.cn/blog_migrate/65ba21b8565f4966056c7b93f5d92acc.png)
第三个printf打印43,两个字符,所以第二 个printf打
印2,一个字符,所以第三个printf打印1
2.
![](https://i-blog.csdnimg.cn/blog_migrate/73e3c3cc10bedfb06bfbb4db774928f7.png)
7.函数的声明和定义(函数和变量都要满足先声明后使用,函数的定义是一种特殊的声明)
在函数调用之前先声明一下这个函数,
声明函数要交代清楚函数名,函数的返回类型和函数的参数
1.单个文件时
函数的调用一定要满足先声明后使用
函数的定义也是一种特殊的声明,如果函数定义放在调用之前也是可以的
2.多个文件时
我们往往会根据程序的功能,将代码拆分放在多个文件中
函数的声明,类型的声明放在头文件(.h)中,函数的实现是放在源文件(.c)文件中
3.static和extren
static是静态的意思
修饰局部变量
修饰全局变量//
改变了变量的链接属性,使得外部链接属性变成了内部 链接属性,及这个全局变量只能在自己所在的.c文件 中使用,即使声明了在其他.c文件中也不能使用(如果 一个全局变量,只想在所在的源文件内部使用不想被其 他文件发现,就可以使用static修饰
修饰函数(和修饰全局变量是一样的)
extern
用来声明外部符号
![](https://i-blog.csdnimg.cn/blog_migrate/db9463073e56e75ad3c7f98dd35b399e.png)
static修饰局部变量 ![](https://i-blog.csdnimg.cn/blog_migrate/d2aa6b09d5ee24fa0a28ecc8eb93d675.png)
1;
![](https://i-blog.csdnimg.cn/blog_migrate/baeba1e67071ab39f560d580d3eec81b.png)
2;
![](https://i-blog.csdnimg.cn/blog_migrate/ed8a24eeb6f2fcb3bb27c56d309e79d0.png)
其实编译器在编译代码的时候,就为静态(static)变量分配了地址,所以a不是进入这个函数时才创建的
4,作用域和生命周期
所用到的名字的可用性的代码范围就是这个名字的作用域
局部变量:变量所在的局部范围
全局变量:整个工程
变量创建到变量销毁之间的一个时间段就是生命周期
局部变量:进作用域到出作用域
全局变量:整个程序的生命周期
函数的返回类型如果没写的话,编译器认为返回的是int类型的值