C语言-->(八)函数

知识点:
1.函数基础
2.函数参数和返回值
3.形参和实参,变量的类型
4.函数声明
5.函数递归

==========================
函数基础

1.函数的定义格式

 返回值类型  函数名(参数列表)

 {

    函数体

 }

功能函数

// 函数可以没有形参
play() {
// 在这个大括号里面说清楚函数是干啥(里面包含了什么代码) printf("播放了MP3\n"); }

返回值,参数

形参:定义函数的时候,函数后面()中的变量

实参:调用函数的时候,传进去的值

#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)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。