函数是完成特点任务的独立程序代码单元。语法规则定义了函数的结构和使用方式。
一.函数的分类
1.从用户的使用角度
1.库函数(标准函数):由系统提供,在程序前包含该函数原型所在的头文件
使用库函数应注意:
(1)函数功能
(2)函数参数数目和顺序,及参数意义和类型函数
(3)函数返回值意义和类型
·用户自定义函数
2.从函数的使用范围
内部函数外部函数
3.从函数参数传递的角度--有参函数和无参函数
形式参数(形参):两数定义中的参数
实际参数(实参):调用的参数
4.一般形式
说明:
(1)类型名为函数返回值类型,如果定义时未指定,系统默认为 int 型;无返回值的数的类型名应为 void;
(2)两数名必须是合法的标识符,不能与其他两数或变量重名
(3)形参类型说明表,一般格式为:
数据类型 n数据类型1 形参1,数据类型2 形参2,…形参 n
5.函数调用
说明:
(1)实参可以是常量、变量、表达式、数等,但在进行函数调用时必须有确定的值。
(2)函数的实参和形参应在个数、类型和顺序上一一对应,否则会发生类型不匹配的错误
(3)对于无参函数,调用时实参表列为空,但()不能省。
6.函数调用方式
(1)函数语句调用
把函数调用作为一个语句
不要求函数带回明确的返回值
只完成一定的操作
(2)函数表达式调用
以表达式形式出现在程序中
要求函数必须带回确定的返回值
(3)参数调用
作为参数出现在程序中要
求函数必须带回确定的返回值
7.函数间数据的传递
(1)传递方式
参数:数据从主调函数传递给被调函数返回值:数据从被调函数返回到主调函数
(2)形式参数和实际参数
形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中对应的参数
(3)实参向形参传递数据的方式:单向的值传递
1)形参定义时编译系统并不为其分配存储空间,也没有初值在函数调用时,临时分配存储空间,接受来自实参的值。函数调用结束,内存空间释放,值消失。
2)实参可以是常量、变量和表达式,但必须在函数调用时有确定的值。
3)实参与形参之间是单向的值传递。
注意:实参和形参占用不同的内存单元
8.函数的调用
9.递归函数
1.直接递归调用
在函数中直接调用函数本身
间接递归调用
在函数中调用其它函数,其它两数又调用原两数
2用个图说明:
第1,每级函数调用都有自己的变量。
第2,每次函数调用都会返回一次。
第3,递归函数中位于递归调用之前的语句,均按被调函数的顺序执行。
第4,递归函数中位于递归函数调用之后的语句,均按被调函数相反的顺序执行。
第5,虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。程序按照顺序执行函数中的代码,而递归调用就相当于又从头开始执行函数的代码。
第6,递归函数必须包含能让递归调用停止的语句。通常,递归函数都使用if或其他其他等价的测试条件在函数形参等于某特定值时终止递归。
3.尾递归
最简单的递归形式是递归调用置于函数的末尾,即正好在return语句之前。这种形式的递归被成为尾递归,因为递归调用在函数的末尾。尾递归是最简单的递归形式,因为它相当于循环。
二.作用域
1.变量的作用域:可以合法访问变量的范围,,由变量的位置来确定。
(1)变量定义有两种位置:
在所有函数之外
在块内
(2)按作用域划分:将变量分为局部变量和全局变量
2.局部变量
定义:在函数内部定义的变量或复合语句内定义的变量
作用域:限于定义它的离数或复合语句任意一个函数都不能访问其它函数中定义的局部变量
1.主函数中定义的变量也属于局部变量。
2.不同的函数中定义的变量,其作用范围都限定在各自的数中。
3.形参也是局部变量
4.编译时,编译系统不为局部变量分配内存单元,而是在程序运行中,当局部变量所在函数被调用时,才根据需要临时分配。
3.全局变量
定义:在所有函数外定义的变量
作用域:从定义的位置开始到本源文件结束
注:如果同一个源文件中,全局变量和局部变量同名,则在局部变量的作用范围内,全局变量不起作用。
三.带地址参数的函数
指针:用于存储变量的地址。scanf()函数1中就使用地址作为参数。如果主调函数不使用return返回的值,则必须通过地址才能修改主调函数中的值。
1.一元&运算符给出变量的存储地址。要创建指针变量,先要声明指针变量的类型
假设一个指针变量名是ptr,可以编写如下语句:
ptr = &pooh; // 把poor的地址赋给 ptr
对于这条语句,我们说ptr "指向" poor。ptr 和 &poor 的区别是 ptr 变量,而&poor 是常量。或者,ptr 是可修改的左值,而&poor 是右值。还可以把ptr 指向别处:
ptr = &bah ;// 把ptr 指向1 bah, 而不是pooh
现在ptr 的值是 bah的地址。
2.间接运算符:*
该运算符有时也称为解引用运算符。不要把间接运算符和二元乘法运算符(*)混淆1,虽然它们使用的符合相同,但语法功能不同。
3.指针
(1)一般格式:基类型名 * 指针变量名;
基类型名:指针变量所指向的变量的类型名称
*:表示它后面的变量名是指针类型
指针变量名:所定义的指针变量的名称
(2)初始化:
用 =&变量名 来给指针变量赋值。
方法1:int x,*p=&x;
方法2: int x,*p; p=&x;
(3)引用指针