一、函数的概念
函数有些翻译为:子程序,c语言中函数就是一个完成某项特定任务的一小段代码,这段代码是有特殊的写法和调用方法的。函数是可以复用的,这大大提高的工作的效率
二、库函数
库函数的学习网站
cplusplus.com - The C++ Resources Network
三、自定义函数
函数的语法形式
返回类型 函数名
ret_type fun_name(形式参数)
{
函数体
}
- 返回类型可以是void
- 函数名一般要取得有意义
函数举例
- 加法函数
也可以简化为
int Add(int x,int y)
- 调用函数
四、实参和形参
- 实参:调用函数时,真实传递的参数叫做实参
- 形参:在定义函数时,参数为形式参数
- 如上所示:x和y是形参,a和b是实参
- 形参只有在函数被调用时,为了存放实参传递过来的值,向内存申请空间,这就是形参的实例化
- 要观察函数内部,不能按F10了,要按F11
-
五、return语句
- 后边可以是数值也可以是表达式,如果是表达式,先执行表达式再返回值
- return后边可以什么都没有,返回类型为void
当n<0时,不符合条件可以使用return直接退出
- return返回的值和函数返回类型不一致,系统会自动将返回的值转换为函数的返回类型
- return语句执行后,函数彻底返回,后边代码不在执行
- 如果函数中存在if等分支语句,要确保每种情况都有return返回,否则出现编译错误
六、将数组作为函数参数
传参只需要写数组的名称
七、嵌套调用和链式访问
一、嵌套调用
例题一
输入某年某月,打印出该年有多少天?
函数之间不能包含另外一个函数,只能嵌套调用,不能嵌套定义
二、链式访问
将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问
第一个打印:43 (有一个空格)
第二个打印:前面有3个字符 所以打印 3 (有一个空格·)
第三个打印:前面的两个字符 所以打印2
八、函数的声明和定义
函数先声明后使用
如果未进行声明时,函数的定义在函数使用的后面,则编译器会报错。因为编译器在对源码进行编译时,从第一行向下扫描,使用时并未扫描到函数的定义就会爆出警告
所以我们需要解决这一问题的话:函数声明
函数的定义是一种特殊的声明,所以如果函数定义在函数调用前也是可以的
九、多文件书写
add.h ——声明
add.c——定义
test.c——代码
一、好处:
- 逻辑清晰
- 方便多人协同
- 适当隐藏代码
十、static和extern
一、作用
static是静态的意思:
- 修饰局部变量
- 修饰全局变量
- 修饰函数
extern:
- 声明外部符号
二、作用域
一段程序中的代码所用到的名字并不总是有效,而限定这个名字的可以性的代码范围就称为这个名字的作用域
局部变量:局部范围
全局变量:整个工程中
三、生命周期
变量创建到变量销毁之间的时间段
程序的生命周期==main函数的生命周期
例一:
i是一个局部变量,当出了函数test(),i的生命周期就结束了,所以i就又被赋值为0
但是当n被static修饰时,出了程序n的值也会被保留下来,所以实现了累加
static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,生命周期就和程序的生命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域不变的:仍旧只能在test()中使用该变量
四、extern
声明外部变量
可以使用extern去声明外部文件的变量
但当外部文件的变量是使用static声明时,则会报错
⼀个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个工程中只要适当的声明就可以被使用。但是被 static 修饰后变成了内部链接属性,使得函数只能在自己所在源文件内部使用。