1. 函数的概念
2. 库函数
2.1 标准库和头文件
C语⾔标准中规定了C语⾔的各种语法规则,C语⾔并不提供库函数;C语⾔的国际标准ANSIC规定了⼀ 些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语⾔标准就给出了⼀系列函数的实现。这些函数就被称为库函数。
我们前⾯内容中学到的 printf 、 scanf 都是库函数,库函数也是函数,不过这些函数已经是现成 的,我们只要学会就能直接使⽤了。有了库函数,⼀些常⻅的功能就不需要程序员⾃⼰实现了,⼀定程度提升了效率;同时库函数的质量和执⾏效率上都更有保证。
各种编译器的标准库中提供了⼀系列的库函数,这些库函数根据功能的划分,都在不同的头⽂件中进 ⾏了声明。 【库函数相关头⽂件:https://zh.cppreference.com/w/c/header】
2.2 库函数的使用方法
库函数的学习和查看⼯具很多,⽐如:
C/C++官⽅的链接:https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
【库函数文档的⼀般格式 1. 函数原型 2. 函数功能介绍 3. 参数和返回类型说明 4. 代码举例 5. 代码输出 6. 相关知识链接】
功能 :Compute square root 计算平⽅根 Returns the square root of x.(返回平⽅根)
头⽂件包含:库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头⽂件,不包含是可能会出现⼀些问题的。
3. 自定义函数
了解了库函数,我们的关注度应该聚焦在⾃定义函数上,⾃定义函数其实更加重要,也能给程序员写代码更多的创造性。
3.1 函数的语法形式
ret_type 是函数返回类型 fun_name 是函数名 括号中放的是形式参数 {}括起来的是函数体
3.2 函数的举例
例⼦: 写⼀个加法函数,完成2个整型变量的加法操作。
Add函数也可以简化为:
函数的参数部分需要交代清楚,未来我们是根据实际需要来设计函数的,函数名、参数、返回类型都是可以灵活变化的。
4. 形参和实参
4.1 实参
在上⾯举例的代码中,是先有Add 函数的定义,有了函数后,再调⽤Add函数的。
调⽤Add函数时,传递给函数的参数a和b就称为实际参数,简称实参。
实际参数就是真实传递给函数的参数。
4.2 形参
在上⾯举例的代码中,函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简 称形参。
4.3 实参和形参的关系
虽然实参是传递给形参的,他们之间有一些联系,但是形参和实参各⾃是独⽴的内存空间。
我们在调试的时候可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不⼀样的,所以我们可以理解为形参是实参的⼀份临时拷贝。
5. return语句
6. 数组做函数参数
在使⽤函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进⾏操作。
⽐如:写⼀个函数将⼀个整型数组的内容,全部置为-1,再写⼀个函数打印数组的内容。
7. 嵌套调用和链式访问
7.1 嵌套调用
嵌套调⽤就是函数之间的互相调⽤,每个函数就像⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝 的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的程序。
7.2 链式访问
所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来就是函数的链式访问。
前⾯的代码完成动作写了2条语句,如果把strlen的返回值直接作为printf函数的参数,这样就是⼀ 个链式访问的例了。
8. 函数的声明和定义
8.1 单个⽂件
⼀般我们在使⽤函数的时候,直接将函数写出来就使⽤了。
⽐如:我们要写⼀个函数判断⼀年是否是闰年。
那如果我们将函数的定义放在函数的调⽤后边,在VS2022上编译,会出现下⾯的警告信息:
函数的调⽤⼀定要满⾜,先声明后使⽤; 函数的定义也是⼀种特殊的声明,所以如果函数定义放在调⽤之前也是可以的。
8.2 多个⽂件
⼀般在企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会 根据程序的功能,将代码拆分放在多个⽂件中。
⼀般情况,函数的声明、类型的声明放在头⽂件(.h),函数的实现是放在源⽂件(.c)⽂件中。
8.3 static和extern
static 和extern 都是C语⾔中的关键字。
static 是静态的意思,可以⽤来: • 修饰局部变量 • 修饰全局变量 • 修饰函数
extern 是⽤来声明外部符号的。
在讲解 static 和 extern 之前再讲⼀下:作⽤域和⽣命周期。
8.3.1 static修饰局部变量:
结论:
static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。
存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域不变的。
8.3.2 static修饰全局变量
8.3.3 static修饰函数