一、什么是函数?为什么要用函数?
(1)函数是完成特定任务的独立程序代码单元。
(2)使用函数可以省去编写重复代码的苦差。
(3)函数让程序更加模块化,从而提高了程序代码的可读性,更方便后期修改、完善。
二、函数的分类
库函数
(1)如printf()、strlen()…,由C语言提供定义,编程时直接调用即可的函数。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
(2)总结:C语言常用的库函数有:IO函数(如:scanf()、printf())、字符串操作函数(如:strlen())、字符操作函数(如:tolower())、内存操作函数(如:memset())、时间/日期函数(如:time())、数学函数(如:sqrt())、其他库函数
(3)注意:使用库函数,必须包含 #include 对应的头文件。
自定义函数
程序员自己设计的函数。
三、创建并使用简单的函数
void starbar (void); //函数原型
int main()
{
starbar(); //函数调用
printf("Hello World!\n");
starbar();
return 0;
}
void starbar(void) //函数定义
{
int count;
for(count = 1; count <= 12; count++)
{
putchar('*');
}
putchar('\n');
}
函数原型:告诉编译器函数的类型;函数定义::明确地指出函数要干什么;函数调用:表明在此处执行函数。
1.函数原型:
(1)函数原型指明了函数返回返回值类型和函数接受的参数类型。在本代码中,函数原型可以放在main()的前面,也可以放在main()里面的声明变量处
(2)当函数接受参数时,函数原型用逗号分隔的列表指明参数的数量和类型。根据个人喜好,你也可以省略变量名。如:
void show_char(char ch, int num)也可以写成void show_char(char, int )。
(3)在函数原型中使用变量名并没有实际创建变量
(4)C语言规定函数要先先定义后使用。如果自定义函数放在主调函数的后面,就需要在函数调用之前加上函数原型声明(函数声明),有一种方法可以省略函数原型却保留函数原型的优点,即把自定义函数放在主调函数的前面。我们要明白使用函数原型声明的原因:为了让编译器在第一次执行到该函数之前就知道如何使用它。
(5)注意:函数原型声明是一条C语句,后面要加分号!
2.函数定义:
(1)函数定义的一般形式为:函数类型名 函数名(形式参数)
{
函数实现过程 //函数体
}
(2)函数名:函数名是函数整体的称谓,需要使用一个合法的标识符表示。
(3)函数体:由一对大括号内的若干条语句组成,并用return语句返回运算的结果给主调函数,使用return语句的另一个作用就是,终止函数并把控制返回给主调函数的下一条语句。return 语句只能返回一个值。定义在函数中的变量是局部变量,属于函数私有,这意味着在其它函数使用同名变量不会引起名称冲突。
(4)函数类型:带返回值的类型应该与其返回值类型相同,没有返回值类型的函数应该声明为void类型。
(5)形式参数:函数定义的函数头中声明的变量,简称:形参。和定义在函数中的变量一样,形式参数也是局部变量,属于函数私有,这意味着在其它函数使用同名变量不会引起名称冲突。注意:每个变量之前都要声明其类型,即void dubs(int x, y, z)是无效的函数头,必须这样写void dubs(int x, int y, int z)
(5)注意:函数定义时的函数首部不是语句,后面不能跟分号
3.函数调用:
(1)函数调用过程:任何C程序执行,首先从主函数main()开始,如果遇到某个函数调用,主函数被暂停执行,转而执行相应函数,该函数执行玩完后将返回主函数,然后再从原先暂停的位置继续执行
(2)函数调用的形式:函数名(实际参数表)。
对于实现计算功能的函数,函数调用通常出现在两种情况:
①赋值语句:volume = cylinder(radius, height);
②输出函数的实参:printf(“%f”,cylinder(radius, height));
(3)实际参数:真实传给函数的参数,叫实际参数,简称实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
(4)参数传递:程序在遇到函数调用时,实参的值依次传给形参。形参和实参必须一一对应,两者数量相同,类型尽量保持一致。
(6)传值调用和传址调用:
①传值调用函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
②传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
四、函数的嵌套调用和链式访问
函数可以嵌套使用,但是不能嵌套定义.
五、函数递归
1.什么是函数递归:函数自己调用自己(主要思考方式:大事化小)
2.递归的基本原理:
(1)每级函数调用都有自己的变量
(2)每级函数调用都会返回一次
(3)递归函数中,位于递归调用之前的语句,均按被调函数的顺序执行
(4)递归函数中,位于递归调用之后的语句,均按被调函数的相反的顺序执行
(5)虽然每级递归都有自己的变量,但是并没有拷贝函数的代码
(6)递归函数必须包含能让递归调用停止的语句
3.两个必要条件:
(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2)每次递归调用之后越来越接近这个限制条件。