章 | 节 | 知识点 | 精讲文档 |
第八章 函数 | 8.1 函数定义的一般形式 | 函数分类 | 1.从用户使用的角度分类 (1)标准函数(库函数): (2)用户自定义函数: 2 .从函数形式分类 (1)无参函数 (2)有参函数 |
函数定义 | 格式: 类型说明符 函数名(形参表列) { 函数内的局部变量类型声明部分; 执行语句部分; } | ||
函数说明部分 | 函数说明部分包括: l 函数类型 l 函数名 l 形式参数 | ||
函数体 | 函数体包括: l 声明部分 l 语句部分 | ||
8.2 函数参数和函数的值
| 形式参数 | 形式参数:简称形参,是指定义函数时,函数名后面括弧中的变量,此部分参数在定义函数时没有实际数值,只是形式上的参数而已。 | |
实际参数 | 实际参数:简称实参,在调用函数时,函数名后括弧中的参数已有确定的值,所以称为实参。 | ||
参数传递 | 函数调用时将实参值一一传送给形参。 注意: l 在发生函数调用时,函数的形参被临时分配内存单元。 l 调用结束,形参单元被释放 l 如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值 | ||
函数返回值 | 返回函数值语句的一般形式: return (表达式) | ||
函数返回值类型 | 函数返回值类型说明: (1)C语言规定,凡未加类型说明的函数,其值的类型一律以整型处理。 (2)return中表达式类型要求和函数值的类型一致,否则以函数类型为准 (3)为了明确表示“不带回值”,可以使用“void”定义“无类型”或“空类型”。 | ||
8.3函数的调用
| 函数调用 | 函数调用的三种方式: (1) 函数语句:将函数调用作为一条语句,函数不带返回值,只完成某项功能操作。如:print_star(); (2) 函数表达式:函数出现在一个表达式中,函数带回一个确定值以参加表达式的运算。如:c=2*max (a,b); (3) 函数参数:函数调用作为一个函数的实参。如: m=max(a,max(b,c)); | |
函数声明 | 如果被调用函数的位置出现在主调用函数的后面,应在主调用函数中对被调用函数作声明。 声明的作用:把函数名、函数参数的个数和参数类型这些信息通知编译系统,以便对被调用函数的编译检查。 函数的声明格式: 在函数定义的第一行后面加一个分号。 如: float add(float x, float y); | ||
函数原型 | 函数原型:把函数定义的首行称为函数原型。 | ||
8.4 函数的嵌套调用 | 嵌套调用 | 一个函数在调用另一个函数的过程中,另一个函数又调用另外一个函数,这种现象称数的嵌套调用。 | |
8.5局部变量和全局变量 | 变量作用域 | 变量作用域即变量的有效范围,可以分为局部变量和全局变量。 | |
局部变量 | 局部变量:在函数体内说明的变量,其作用范围被限制在该函数之内,并且只从其说明处之后有效。 | ||
全局变量 | 全局变量:在函数定义之外说明的变量称为全局变量(外部)变量。全局变量作用范围比局部变量大,从说明该变量处起,之后所有的函数都可以使用它。即有效范围为从定义变量的位置开始到本源文件结束。 | ||
8.6 变量的存储类型 | 变量存储类型 | 从变量值存在的时间(即生存期)观察,可分为两种不同的存储变量:静态存储变量和动态存储变量。 | |
自动变量 | 自动变量定义格式: auto 类型名 变量名 说明:存储在动态存储区中,主要是指函数的动态局部变量和形式参数。auto可省略。 | ||
静态变量 | 定义格式: static 类型名变量名 说明:静态变量存储在静态数据区,在其所在的函数和程序中是永久变量。 | ||
寄存器变量 | 定义格式: register 类型名 变量名 | ||
外部变量 | 格式: extern 类型名变量名 | ||
8.7 函数的递归调用 | 递归调用 | 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 | |
递归函数 | 递归问题求解一般需要满足以下三个条件: (1)原问题能够向另一个相对更简单的问题转化。 (2)转化后的问题和原来问题求解类似。 (3)转化能够有一个终止的条件。 题目:采用递归法求n的阶层。 • 解题思路: l n! = (n-1)!×n l (n-1)!=(n-2)!×(n-1) l … l 2!=1! ×1 l 1!=1 递归函数如下: long fac(int n) { long f; if(n==1) f=1; else f=fac(n-1)*n; printf("\n return:n=%d f=%ld",n,f); return(f); } |

