C语言函数与宏定义课件.ppt
《C语言函数与宏定义课件.ppt》由会员分享,可在线阅读,更多相关《C语言函数与宏定义课件.ppt(54页珍藏版)》请在三一办公上搜索。
1、*,1/49,第1章 函数与宏定义,1.1 函数概念,1.2 变量作用域和存储类型,1.3 内部函数与外部函数,1.4 递归函数的设计和调用,1.5 预处理,1.6 综合范例,*,2/49,1.1 函数概念,C语言中,函数可分为两类:,一类是由系统定义的标准函数,又称为库函数,其函数声明一般是放在系统的include目录下以.h为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函数之前用#include命令将库函数信息包含到本程序中。,另一类函数是自定义函数,*,3/49,1.1.1 函数定义,存储类型符 返回值类型符 函数名(形参说明表)函数语句体,*,4/49,说明:,1存储类型符
2、指的是函数的作用范围,它只有两种形式:static和extern。static说明函数只能作用于其所在的源文件,用static说明的函数又称为内部函数。extern说明函数可被其它源文件中的函数调用,用extern说明的函数,又称为外部函数。缺省情况为extern。,2返回值类型符指的是函数体语句执行完成后,函数返回的值的类型,如int,float,char等等,若函数无返回值,则用空类型void来定义函数的返回值。缺省情况为int型。,*,5/49,3函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。,4 形参说明表是一系列用逗号分开的每个形参变量说明。如:int x,i
3、nt y,int z这表示形参变量有三个:x,y,z。它们的类型都是int型。,5函数语句体是放在一对花括号 中,由局部数据类型描述和功能实现两部分组成。,*,6/49,6函数返回语句的形式有以下两种:函数无返回值的情况:return;或者什么也不写函数有返回值的情况:return(表达式的值);在第种情况下要注意“表达式的值”的类型必须与函数返回值的类型相一致。,例如:求两个任意整数的绝对值的和,用函数abs_sum()实现。,/*直接调用库函数来计算m和n的绝对值*/int abs_sum(int m,int n)return(abs(m)+abs(n);/*函数abs()是在头文件mat
4、h.h中声明的*/,*,7/49,函数定义如下:int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return(m+n);,1.1.2 函数声明和调用,1函数的声明函数声明的一般形式:,存储类型符 返回值类型符 函数名(形参说明表);如:int abs_sun(int m,int n);,*,8/49,2函数调用函数调用是通过函数调用语句来实现的,分两种形式:,无返回值的情况:函数名(实参表);有返回值的情况:变量名函数名(实参表);该变量名的类型必须与函数的返回值类型相同。,函数调用时都会去执行函数语句中的内容,函数执行完毕后,回到函数的调用处,继续
5、执行下面的语句。,*,9/49,1.1.3 函数的传值方式,函数的传值方式:采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实参表传过来的值时,会在内存临时开辟新的空间,以保留形参变量的值,当函数执行完毕时,这些临时开辟的内存空间会被释放,并且形参的值在函数中不论是否发生变化,都不会影响到实参变量的值的变化,这就是函数的传值方式。,自定义函数在程序中的使用顺序有两种形式:,先进行函数声明,再进行函数调用,函数定义放在函数调用之后。函数声明在函数调用之前。函数定义放在函数调用之前。,*,10/49,【例1-1】编程序,通过调用函数abs_sum(),求任意两个整数的绝对值的
6、和。,/*exam1_1.c 调用函数求两整数绝对值的和*/#include int abs_sum(int m,int n);main()int x,y,z;scanf(%d%d,程序运行结果:7 12sum is 19,*,11/49,用传值方式调用函数时,实参也可以是函数调用语句,【例1-2】求任意三个数的绝对值的和。,/*exam1_2.c 调用函数求三个整数绝对值的和*/#include int abs_sum(int m,int n);main()int x,y,z,sum;scanf(%d%d%d,程序运行结果:7 12 5sum is 24,*,12/49,注意:,对于有返回值
7、的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数的返回值有可能会被丢失。,【例1-3】求任意两数的乘积。,自定义一个函数mul(),用于求两数的乘积,程序:/*exam1_3.c 求两个数的乘积*/#include float mul(float a,float b);main()float x,y,z;scanf(%f%f,/*/,*,13/49,x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y);/*/float mul(float a,float b)return a*b;,程序运行结果:5 6z=30.000000,m
8、ul(30.000000,-8.000000)=-240.000000,*,14/49,程序说明:,注释处调用函数后的返回值赋给变量z。,注释处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。,注释处调用函数后的返回值成为了printf()函数的参数。,*,15/49,1.2 变量作用域和存储类型,1变量的作用域,变量的作用域:指的是变量的有效范围,针对变量不同的作用域,可把变量分为局部变量和全局变量。,局部变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有效范围只限于本函数内部,退出函数,该变量自动失效。,全局变量:在函数外面定义的变量称为全局变量,全局变量的作用域
9、是从该变量定义的位置开始,直到源文件结束。在同一文件中的所有函数都可以引用全局变量。,*,16/49,局部变量和全局变量的作用域如图所示:,*,17/49,【例1-4】变量作用域应用举例,阅读下面的程序,注意区分局部变量和全局变量的作用域。,/*exam9_4.c 变量作用域举例*/#include void a(void);void b(void);void c(void);int x=1;main()int x=5;printf(local x in outer scope of main is%dn,x);,*,18/49,int x=7;printf(local x in inner
10、scope of main is%dn,x);printf(local x in outer scope of main is%dn,x);a();b();c();a();b();c();,前三次输出结果:local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5,*,19/49,printf(local x in main is%dn,x);getchar();return 0;void a(void)int x=25;printf(nloc
11、al x in a is%d after entering an,x);+x;printf(local x in a is%d before exiting an,x);,*,20/49,void b(void)static int x=50;printf(nlocal static x is%d on entering bn,x);+x;printf(local static x is%d on exiting bn,x);void c(void)printf(nglobal x is%d on entering cn,x);x*=10;printf(global x is%d on exi
12、ting cn,x);,*,21/49,程序运行结果:后6次函数调用,local x in a is 25 after entering alocal x in a is 26 before exiting alocal static x is 50 on entering blocal static x is 51 on exiting bglobal x is 1 on entering cglobal x is 10 on exiting clocal x in a is 25 after entering alocal x in a is 26 before exiting aloca
13、l static x is 51 on entering blocal static x is 52 on exiting bglobal x is 10 on entering cglobal x is 100 on exiting c,最后一次输出:local x in main is 5,*,22/49,2变量的存储类型,变量的存储类型:指的是变量的存储属性,它说明变量占用存储空间的区域。,在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区三部分组成。,变量的存储类型有四种:auto型、register型、static型和extern型。,auto型变量存储在内存的动态存储区。
14、register型变量保存在寄存器中。static型变量和extern型变量存储在静态存储器。,*,23/49,局部变量的存储类型缺省值为auto型。全局变量的存储类型缺省值为extern型。,auto型变量和register型变量只用于定义局部变量。static型变量即可定义成局部变量,又可定义成全局变量。,【例1-5】设计一个函数:long fac(int n),可用来计算15的阶乘。,分析:可在函数中定义一个static型变量,用来保存上次的计算结果。,*,24/49,/*exam1_5.c 用static型变量保留上次阶乘的值*/#include long fac(int n)stat
15、ic int f=1;f=f*n;return f;main()int i;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);,程序运行结果:1!=1 2!=2 3!=6 4!=24 5!=120,局部变量f被定义成static型的,因此,它只在该函数第1次被调用的时候初始化其值为1,以后再调用该函数时,不再进行初始化,而是使用上一次调用的值。,*,25/49,1.3 内部函数与外部函数,1内部函数,若函数的存储类型为static型,则称其为内部函数或称静态函数,它表示在同一个程序中(由多个源文件组成),该函数只能在一个文件中存在,在其它文件中不可使用。,如:st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 函数 定义 课件
链接地址:https://www.31ppt.com/p-6503791.html