函数
库函数
库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头⽂件
C/C++官⽅的链接: https://zh.cppreference.com/w/c/header
cplusplus.com: https://legacy.cplusplus.com/reference/clibrary
自定义函数
格式
ret_type fun_name(形式参数)
{
}
ret_type 是函数返回类型
fun_name 是函数名
括号中放的是形式参数
{ }括起来的是函数体
形参和实参
形参
函数名后()里的形式参数
如果只是定义了函数 ,而不去调用的话, 函数参数只是形式上存在的,不会向内存申请空间,不
会真实存在的,所以叫形式参数
形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就
是形参的实例化
实参
调用函数时,传递给形式参数的实际参数
形参和实参的关系
形参和实参是各自独立的内存空间,可以理解为形参是实参的临时拷贝
return语句
return语句使用的注意事项:
return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执行表达式,再返回表达式
的结果
return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况
return返回的值和函数返回类型不⼀致,系统会自动将返回的值隐式转换为函数的返回类型
return语句执行后,函数就彻底返回,后边的代码不再执行
如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误
数组做函数参数
数组在传参的时候,实参就写数组名就行,加上[ ]会被识别成数组元素
实参和形参的名字是可以一样的,也可以不一样
函数的在设计的时候,一定要尽量功能单一
数组在传参的时候,形参的数组和实参的数组是同一个数组,不是拷贝
函数的形式参数要和函数的实参个数匹配
函数的实参是数组,形参也是可以写成数组形式的
形参如果是一维数组,数组大小可以省略不写
形参如果是二维数组,行可以省略,但是列不能省略
嵌套调用
函数之间的互相调用,每个函数就像⼀个乐高零件,正是因为多个乐高的零件互相无缝的配合才能
搭建出精美的乐高玩具,也正是因为函数之间有效的互相调用,最后写出来了相对大型的程序
链式访问
将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数
的链式访问
函数的声明和定义
单个文件
先声明,后调用,函数的定义也是一种特殊的声明
多个文件
头文件声明,源文件定义,调用函数的源文件头文件用#include"头文件.h"
好处 方便团队协作
代码模块化 逻辑更加清晰
可以隐藏代码
static
是静态的的意思,可以用来:
修饰局部变量
修饰全局变量
修饰函数
static修饰局部变量
改变了局部变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来局部变量
存储在内存的栈区,但是被 static 修饰后存储到了静态区
存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期⼀样了,只有程序
结束,变量才销毁,内存才回收,但作用域不变
一个局部变量出函数后,还想保留值,等下次进入函数继续使用,就可以使用static修饰
static修饰全局变量或函数
使得这个全局变量或函数只能在本源文件内使用,不能在其他.c文件内使用
全局变量或函数默认是具有外部链接属性的,其他.c文件想使用,只要适当声明就可以使用
但是被static修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的.c文件内部使用,
其他.c文件,即使声明了,也无法正常使用。
如果⼀个全局变量或函数,不想被其他.c文件发现,可以使用static修饰
extern
extern是用来声明外部符号的,如果一个全局的符号在A.c文件中定义的,在B.c文件中想使用,就
可以使用extern进行声明,然后使用