文章目录
- 7.1 函数的作用
- 7.2 定义函数
- 7.3 调用函数
- 7.4 对被调用函数的声明和函数原型
- 7.5 函数的嵌套调用
- 7.6 函数的递归调用
- 7.7 数组作为函数参数
- 7.8 局部变量和全局变量
- 7.9 变量的存储方式和生存周期
- 7.10 关于变量的声明和定义
- 7.11 内部函数和外部函数
7.1 函数的作用
-
1、概述
函数是指功能。每一个函数用来实现一个特定的功能,函数的名字反映其代表的功能。如下图是一个程序中函数调用的示意图。
-
2、函数分类
- (1)从用户使用的角度划分
①库函数
库函数是由系统提供的,用户不必自己定义,可直接使用它们。
②用户自己定义的函数- (2)函数形式的划分
①无参函数
在调用无参函数时,主调函数不向被调用函数传递数据。
②有参函数
主调函数在调用被调用函数时,通过参数向被调用函数传递数据。
7.2 定义函数
-
1、原因
- (1)概述
C语言要求,在程序中用到的所有函数,必须“先定义,后使用”。 - (2)主要内容
①指定函数的名字;
②指定函数的类型,即函数返回值的类型;
③指定函数的参数的名字和类型;
④指定函数的功能。 - (3)库函数
对于C编译系统提供的库函数,只需用#include指令把有关的头文件包含到本文件模块中即可。
- (1)概述
-
2、定义方法
- (1)定义无参函数
类型名 函数名(){ }
对于有返回值的函数,必须要有相应的返回值(通常是用return 语句进行返回)
- (2)定义有参函数
类型名 函数名(形式参数表列) { 函数体 }
- (3)定义空函数
在程序设计中有时会用到空函数,它的形式为
类型名 函数名() { }
7.3 调用函数
- 1、函数调用的形式
- (1)一般形式
函数名(实参列表);
若有参数,则用逗号隔开;若无参数,则括号中为空。 - (2)函数调用方式
①函数调用语句
把函数调用单独作为一个语句。
②函数表达式
函数调用出现在另一个表达式中,这时要求函数带会一个确定的值以参加表达式的运算。
③函数参数
参数调用作为另一个函数调用的实参。
- (1)一般形式
- 2、函数调用时的数据传递
定义函数时括号中的参数为形参,调用该括号中的参数为实参,在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参。 - 3、函数调用的过程
- 4、函数的返回值
return语句的返回值类型必须和所定义的函数值类型相同,若无返回值则定义函数为void类型。
7.4 对被调用函数的声明和函数原型
在一个函数中调用另外一个函数(即被调用函数)需要具备如下条件:
(1)首先被调用的函数必须是已经定义的函数。
(2)如果使用库函数,应该在本文件开头用#include指令进行调用。
(3)如果被调函数在主调函数之后,则应进行生命,函数原型格式如下:
类型名 函数名(形参类型1,形参类型2,…);
说明:
如果已在文件的开头(在所有函数之前),已对本文件中所调用的函数进行了生命,则在各函数中不必对其所调用的函数再作生命。写在所有函数前面的外部生命在整个文件范围中有效。
7.5 函数的嵌套调用
嵌套即在调用一个函数的过程中,又调用另一个函数,如下图所示:
7.6 函数的递归调用
-
1、定义
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 -
2、分类
- (1)直接调用本函数
在定义函数f的过程中,又要调用f函数,这是直接调用本函数,如下图所示:
- (2)间接调用本函数
如果在调用f1函数过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数,这是间接调用本函数,如下图所示:
- (1)直接调用本函数
说明:为了防止出现无终止地调用,应该用相关的控制语句(如if)来终止自身调用。
7.7 数组作为函数参数
- 1、数组元素作为函数实参
数组元素可以用作函数实参,不能用作形参。在用数组元素作函数实参时,把实参的值传给形参,是“值传递方式”。数据传递的方向是从实参传到形参,单向传递。 - 2、数组名作函数参数
用数组名既可以做形参也可以做实参,当用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。 - 3、多维数组名作函数参数
可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。
7.8 局部变量和全局变量
- 1、局部变量
- (1)定义
局部变量是指在程序中只在特定过程或函数中可以访问的变量。 - (2)定义位置
①在函数的开头定义;
②在函数内的复合语句内定义;
③在函数的外部定义; - (3)作用范围
①只在所定义的函数中有效;
②不同函数可以使用相同变量名;
③形式参数只能在本函数内使用;
④在复合语句中的变量作用仅限于该语句。
- (1)定义
- 2、全局变量
- (1)概述
在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。一般全局变量名的第一个字母用大写表示。 - (2)作用
设置全局变量增加了函数之间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值。
- (1)概述
7.9 变量的存储方式和生存周期
- 1、变量的存储位置
变量按存储位置划分有:
- 2、变量的生存期
变量按生存期划分有:
一般地所有全局变量以及静态的局部变量存放在静态存储区中。 - 3、变量的作用域
变量按作用域划分有:
- 4、关于作用域和生存期的概念,如下表是变量的作用域和和生存期。
7.10 关于变量的声明和定义
一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。例如:
int main() {
extern A; //是声明,不是定义。
//声明将已定义的外部变量A的作用域扩展到此 …
return 0;
}
int A; //是定义,定义A为整型外部变量
7.11 内部函数和外部函数
- 1、内部函数
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static,即:
static 类型名 函数名(形参表);
内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件。 - 2、外部函数
- (1)定义
如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则默认为外部函数 - (2)调用
在需要调用此函数的其他文件中,需要对此函数作声明。在对此函数作声明时,要加关键字extern,表示该函数“是在其他文件中定义的外部函数”。
- (1)定义