1.函数的基本概念:把一些大的或者功能相同的程序分成一个个程序块;函数是构成程序的基本单元。
使用函数的好处:函数的使用可以省去重复代码的编写;函数可以使程序更加模块化,提高程序的可读性。
2.函数的分类:
①根据函数的定义方式可以分为:库函数、用户自定义函数
②根据是否有参数可以分为:有参函数、无参函数
③根据是否有返回值可以分为:有返回值函数、无返回值函数
3.函数的说明:
①函数不能嵌套定义(不能在函数里定义函数);
②允许函数嵌套使用(在一个函数中调用另一个函数);
③允许递归调用(在函数中调用自己本身);
④C语言中有且只有一个main函数,系统负责调用main函数,并且从main函数开始执行;
⑤main函数可以调用其他函数,但不允许其他函数调用main函数。
4.函数的定义:
一般形式:
(返回值类型说明)默认是int 函数名(参数1,参数2,参数3…)
①无参无返回值函数的定义:
void 函数名(void) //函数头(形参为空)
{
语句块; //函数体
}
②有参函数的定义:
返回值类型 函数名(形参列表)
{
语句块;
return x; //如果返回值类型不为空,那么必须要有返回值,并且返回值类型必须一致
}
③无返回值有参数的函数定义:
void 函数名(参数列表)
{
语句块;
}
④有返回值无参数的函数定义:
返回值类型 函数名()
{
语句块;
return x;
}
例子:
void fun(); //无参无返回值的函数
void fun(int a,int b); //带两个整型参数无返回值的函数
int fun(); //无参数返回值为整型的函数
int fun(int a); //带一个整型参数返回值为整型的函数
5.函数定义的说明:
①返回值类型,是函数返回给调用者的数据类型;
②函数名是用户定义的标识符,一般来说要符合命名规则。
6.函数的参数:
形参:函数定义时用于占位的参数(定义函数时参数列表里的参数)。形参的内存只有在调用时系统才会分配,结束后系统自动释放其内存。
实参:函数被调用,在main函数里赋予的参数(调用函数时,传进去的参数)。
注:因为形参只在函数内部有效,所以无论形参如何改变,都不会影响到实参(值传递的原因);形参出现在函数定义中,并在整个函数体内都有效,当该函数结束后不能使用;实参出现在主调函数中,进入被调函数后,形参将得到实参的值。
实参和形参的特点:
①实参和形参在数量上,类型上和顺序上应严格一致;
②形参变量只有在被调用时才分配内存单元,只在定义它的函数内部有效,函数结束后不能再使用(局部变量),使用后内存被释放;
③实参和形参占据不同的存储单元(分布在不同的栈区);
④函数默认采用值传递的方式,实参的值单向传给形参,所以无论形参如何改变,实参的值都不会变;
⑤实参可以是常量、变量、表达式甚至是函数,但在传递之前,必须有一个确定的值。
7.函数的调用:
函数的调用形式: 函数名(实际参数列表);
C语言中允许一个函数调用另一个函数(但不能调用main函数),如果函数的定义在调用之后,需要使用函数声明进行前置声明;如果函数的定义在函数使用之前,则可以不使用函数声明。
8.函数的返回值:
①返回值是函数被调用之后,被调用函数返回给主调函数的值;
如:
return; //在无返回值函数中使用,也可以不使用
return (常量); //如return 100;ruturn "OK";
return (变量); //如return a;
return (表达式); //如return a*b;
return (计算语句); //如return (a>b?a:b);
②返回值类型应当和函数定义时的返回值类型保持一致,如果不一致,则以函数定义时为准,自动进行类型转换。
③在函数中,允许有多个return语句,但每次调用只能有一个return语句被执行,只能有一个返回值。
9.函数递归:
函数的递归调用:在一个函数中,直接或间接调用函数本身。
注:必须有一个明确的结束递归条件,否则可能造成系统卡死;函数中每次调用该函数本身时,需解决的问题必须更小。