C语言-->(八)函数
知识点:
1.函数基础
2.函数参数和返回值
3.形参和实参,变量的类型
4.函数声明
5.函数递归
==========================
一、函数基础
函数的作用:封装一个常用的功能
定义函数的步骤:
1>明确函数的作用,起一个有意义的名称
2>确定函数的参数:想清楚调用函数的时候是否需要传入外界的一些数据
3>确定函数的返回值:想清楚函数调用完毕后是否需要返回一个值给函数调用者
1.函数的定义格式
返回值类型 函数名(参数列表)
{
函数体
}
(1)功能函数
// 函数可以没有形参
play() { // 在这个大括号里面说清楚函数是干啥(里面包含了什么代码) printf("播放了MP3\n"); }
(2)返回值,参数
形参:定义函数的时候,函数后面()中的变量
实参:调用函数的时候,传进去的值
#include <stdio.h>
double average(int v1, int v2) // 变量v1、v2称为“形式参数”,简称“形参”。 ()中的内容可以称为“形参列表” { // 计算平均数 double result = (v1 + v2)/2.0; // return的2个作用 // 1.退出函数 // 2.将右边的值返回给函数调用者 return result; } // 任何C语言程序默认情况下,只会执行main函数 int main() { // 调用函数 play(); // 调用average函数 double d = average(10, 20); double d1 = average(30, 40); printf("d1 is %f\n", d1); return 0; }
建议:
以后尽量把常用的代码\功能封装到一个函数里面去,这样可以提高代码重用率,可以提高可扩展性
2.函数作用
1)使程序结构清晰简洁
2)部分代码重复利用降低代码冗余
3)独立的工作内容和模块
3.函数的分类
使用角度分类:
API application programe interface
ASCII C89 C99 C11
1)标准c库函数,由系统实现好的一些列功能函数
如:printf, scanf, fabs, labs…
除c库以外的函数称为第三方函数
2)用户自定义函数,由用户自定义的功能函数
从函数形式分类:
1)无参函数 void
2)有参函数
3)有返回值 对应类型
4)无返回值 void
4.函数说明
1)一个程序有若干个文件,每个文件有若干个函数组成
2)c程序由main函数开始,也从main函数结束
3)源程序中的所有函数在结构上是平行的,互相独立的
4)main函数可以调用其他函数,函数之间可以相互调用
===========================
函数参数和返回值
2)调用过程中实参和形参
3.如果没有参数时一般将参数列表置空
没有参数时,参数列表一般填写void
3.return 作用分析
1)当函数需要有返回值的时候,用来将结果返回
2)思考:如果函数没有明确返回值的时候,是否可以使用? 见上得功能函数
3)return 的另外一个作用是提前结束该函数,并且返回到函数调用者处,return后的代码不会被执行
===========================
形参和实参关系
1.例子:交换两数
2.参数传递的方式和过程
1)值传递
2)地址传递
===========================
全局变量和局部变量
全局变量:共享数据
1.变量的分类
1)函数参数和内部变量称为局部变量
2)在函数外部的变量称为全局变量
2.作用域,生命周期(变量有效范围)
1)局部变量的作用域为当前函数,从变量开始到函数结束
2)全局变量的作用域为所有文件,从变量开始到程序结束
3.生命周期(变量的有效时间)
1)只在函数运行期间有效,一旦函数执行完毕后,变量将会被系统销毁
2)全局变量在整个程序运行期间有效,直到程序退出才会被系统销毁
4.参数屏蔽
局部变量屏蔽全局变量
局部变量和全局变量的变量名一致
===========================
函数声明
1.函数声明的作用
1)让调用者知道如何调用
2)让编译器在编译阶段判断函数调用是否正确
思考:函数声明是否有必要?如果没有声明会如何(从参数和返回值方面思考)
2.声明方式
声明了函数的名字,参数个数和类型,返回值类型
===========================
函数递归
例子:从前有座山…
1.什么是递归
函数调用自身的过程
2.递归作用
递归经常被用于解决计算机科学的问题。
3.应用场合
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。
(树的遍历,图的搜索)
4.实例:
1)计算1+2+3+…+n
练习:1.用函数递归计算1*2*3*…*n的值
2.用函数递归输入10进制,输出2进制 1010
2)用函数递归计算斐波那切数列
1>示例:通过循环实现斐波那切数列
2> 通过递归实现
5.递归缺点
1)递归算法解题相对常用的算法如普通循环等,运行效率较低。
因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况比
递归更为适合的时候。
2)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。
补充:
// 终端上用control+x可以退出死循环
// 函数调用自己本身可能会出现死循环
// 函数调用自己本身,称为“递归”