1.函数概述:
- 函数→function→功能,函数就是能完成一定功能的程序段。
- 如果程序规模不大,只需一个主函数和基本的库函数即可。
- 否则,用户需要编写能实现一定功能的子函数。
2.函数的功能:
- 主函数就像一个控制面板,子函数就像控制面板上的按钮。
- 每个子函数可以实现功能。
- 子函数可以减少重复编写程序段的工作量。
- 同一个子函数可以被一个或多个函数多次调用。
3.函数使用说明:
- C程序是由一个或多个函数组成。
- C程序总是从main函数开始执行,而不管将其写在前面、中间或最后。在调用完其它函数后返回到main函数。
- 子函数相互独立,可以互相调用,但是子函数不可调用主函数。
4.函数分类:
- 从用户角度看,C语言函数分为两类:
(1)库函数(标准函数):是系统提供定义,用户编程时可直接调用。printf(),scanf()。
(2)用户定义函数:是用户自己编写的用来解决具体问题的函数。cylinder(),max(),PrintStar()。
- 从函数的形式看,函数分为两类:
(1)无参函数:不需要向函数传递参数。PrintStar()。
(2)有参函数:需要向函数传递必要的参数。cylinder(r,h),max(a,b)
- 从函数有无返回值看,函数分为两类:
(1)有返回值函数:函数经过运算,得到一个明确的结果,并需要回送该结果。cylinder(r,h),max(a,b)。
(2)无返回值函数:函数只是完成一系列操作步骤,不需要回送任何运算结果。PrintStar(),PrintMessage()。
5.函数定义:
1.函数定义的一般形式:
类型标识符 函数名(形式参数说明表)→函数首部
{
函数实现过程; →函数体
}
2.函数定义说明:
(1)类型标识符:
- 函数的类型,与return语句返回值的类型相同。可以理解为函数最终的结果类型。
- 可以是任何一种有效的类型,缺省时默认为整型。
- 若函数无返回值,类型标识符为void。
(2)函数名:
- 它的命名要符合C语言的标识符命名规则:由字母、数字和下划线组成,其中第一个字符必须是字母或下划线。
- 函数名必须唯一,不能与函数体内变量或形参名相同。
(3)形参表:
- 形式参数(形参):在定义函数时,函数名后面括号中的变量名。形参是变量,必须指定类型。例如:double cylinder(double r,double h)。
- 形参主要是用于接受主调函数传递过来的数值。形参类型必须与传递过来的数据类型一致。例如:v=cylinder(radius,height)。
- 形参的命名只要符合变量的命名规则即可,无需和主调函数中的变量名一致。
- 每个形参必须单独说明类型,形参间用逗号间隔。
- 可以不带形参:如果函数无需从主调函数处接收数据,可以不带形参,但是圆括号不能省略。
6.函数的调用:
- 定义完一个函数后,就可以在程序中调用这个函数。
- 调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。
- 调用自定义函数时,程序中必须有与调用函数相对应的函数定义。
1.函数调用的一般格式:
函数名(实参表)→常量、变量、表达式
- 实际参数(实参):调用函数时函数名后面括号中的内容。
- 实参列表中可以含有多个参数,每个参数间用逗号隔开。
- 实参表中变量和表达式要有确定的值。
- 实参也可没有,但括号不能省略,如PrintStar()。
2.函数调用的一般过程:
- 主函数开始;
- 遇到主函数调用某个子函数时,主函数被暂停执行;
- 子函数执行;
- 执行完后返回主函数;
- 再从主函数暂停位置处继续执行,直到结束。
3.函数调用的方式:
- 函数语句:即把函数调用作为一个语句。如:
PrintStar();
printf(“***********”);
这时不要求函数带返回值,只要求完成一定的操作,通常将函数定义为“void”类型。 - 函数表达式:函数出现在可以写表达式的地
方,此时需要的是函数的值。如:
c=2*max(a,b);
printf(“%d”,max(a,b));
4.函数参数传递说明:
- 实参可以是常量,变量,表达式,但必须有确定的值
- 形参是变量,必须指定类型
- 在参数传递过程中,实参把值复制给形参。
- C语言中,参数的传递是“值传递”,即单向传递。数据只能由实参传送给形参,而不由形参传回给实参。
- 形参和实参一一对应:数量一致,类型一致,顺序一致。
- 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放。
5.函数返回值:
- 在调用函数时,有时需要将运算结果返回主调函数,此时函数返回值就需要使用return语句实现。
- return语句形式:
return 表达式;或者
return (表达式);
例如: return result;
return 0;
return(x>y?x:y)
- 若函数无返回值时,函数类型说明为void,且不能略。 如:void PrintStar()
{printf("****** ");}
return语句只返回一个值。 - return语句具有两个功能:
①结束函数的运行;
②带着运算结果(表达式的值)返回主调函数。
如果return语句为:return ;
则表示仅返回到调用函数的调用点,不带返回值。 - 在一个函数中,return语句可以出现多次,但每次执行只能有一条return语句被执行。
6.函数声明:
函数类型 函数名(参数表);
double cylinder (double r, double h);
void pyramid (int n);
- 只写函数定义中的第1行(函数首部),并以分号结束。
- 函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。
- 如果是库函数,应在文件开头引用头文件;
- 如果被调用函数定义在调用它的函数后面
应在主调函数中对被调函数作声明;
在所有函数之前对被调函数作声明,此时在主调函数中就不必再作声明了。 - 如果被调函数定义在调用它的函数的前面,在主调函数之前可以不加声明。
7.变量与函数:
1.局部变量和全局
(1)局部变量
- 在函数内定义的变量(包括形参)
作用范围:本函数内部 - 定义在复合语句内的变量
作用范围:复合语句内部
(2)全局变量
- 在函数以外定义的变量,不从属于任一函数。
作用范围:从定义处到源文件结束(包括各函数)
2.变量生命周期和静态局部变量
(1)自动变量(auto): 普通的局部变量
int x, y; auto int x, y;
char c1; auto char c1;
- 函数调用时,定义变量,分配存储单元。
- 函数调用结束,收回存储单元。
(2)全局变量:从程序执行开始,到程序的结束,存储单元始终保持。
(3)变量生命周期:变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程。
三、实验心得体会:
经过这次的实验作业,我发现自己在函数部分掌握的还是比较好的,思路也很清晰。