书签 分享 收藏 举报 版权申诉 / 87
上传文档赚钱

类型《C语言程序设计实用教程》课件第5章 函数.ppt

  • 上传人(卖家):momomo
  • 文档编号:5787113
  • 上传时间:2023-05-09
  • 格式:PPT
  • 页数:87
  • 大小:923KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《C语言程序设计实用教程》课件第5章 函数.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C语言程序设计实用教程 C语言程序设计实用教程课件第5章 函数 语言程序设计 实用教程 课件
    资源描述:

    1、5.1 函数的定义与调用函数的定义与调用5.2 函数的参数传递函数的参数传递5.3 函数的重载函数的重载5.4 函数嵌套与递归函数嵌套与递归5.5 返回指针类型的函数返回指针类型的函数5.6 指向函数的指针指向函数的指针5.7 变量的作用域与可见性变量的作用域与可见性5.8 变量的存储类型和生存期变量的存储类型和生存期5.9 C 程序的多文件结构程序的多文件结构5.10 编译预处理编译预处理第第5章章 函数函数n模块化程序设计思路:模块化程序设计思路:n在设计一个较大的程序时,往往把它分为若干在设计一个较大的程序时,往往把它分为若干个模块,每一个模块用一个函数(模块单位)个模块,每一个模块用一

    2、个函数(模块单位)实现实现.n一个函数一个函数(过程过程):完成一个具体的、独立的完成一个具体的、独立的功能。功能。n函数是处理问题过程的一种抽象,函数编函数是处理问题过程的一种抽象,函数编写好后,有利于代码的重用写好后,有利于代码的重用.第第5章章 函数函数n程序结构:由一个主函数和若干个其他程序结构:由一个主函数和若干个其他函数构成函数构成.n主函数调用其他函数,其他函数也可以互相调主函数调用其他函数,其他函数也可以互相调用用5.1 函数的定义与调用函数的定义与调用n5.1.1函数的定义函数的定义n5.1.2函数的调用函数的调用5.1.1 函数的定义函数的定义n程序中用到的所有函数,程序中

    3、用到的所有函数,一般要一般要“先定先定义义函数函数,然然后后调用调用”n定义定义函数时指明:函数时指明:n函数函数名字名字、n函数函数返回值类型返回值类型、n参数的个数与类型参数的个数与类型n函数实现的函数实现的功能功能。5.1.1 函数的定义函数的定义n函数的声明格式函数的声明格式:返回值类型 函数名(形式参数表)/函数头 语句序列 /函数体函数声明例子:求函数声明例子:求阶乘阶乘n!n!long Factor(int n)long Factor(int n)long s=1;long s=1;for(i=1;i=n;i+)for(i=1;ib?a:b;return ab?a:b;函数的调用

    4、:c=max(2,3);5.1.1 函数的定义函数的定义 2.返回类型返回类型(2)如果返回类型不写,则默认的返回类型为如果返回类型不写,则默认的返回类型为int。例如:main()return 0;该函数的返回类型是int。函数体中应有:return expression;5.1.1 函数的定义函数的定义 2.返回类型返回类型 (3)返回类型为返回类型为void,表示函数调用后无返回值,表示函数调用后无返回值n在函数体中可不写在函数体中可不写return语句,函数调用执行到函数语句,函数调用执行到函数体的最后一个右括号体的最后一个右括号“”,将自动返回到调用者。,将自动返回到调用者。n如果写

    5、如果写return语句,在语句,在return之后必须不带返回值。之后必须不带返回值。例如:5.1.1 函数的定义函数的定义void printHello()printf(“Hello,every one!n”);return;/可缺省可缺省函数的调用:printHello();printHello()3.return 语句的一般格式:语句的一般格式:return 表达式;nreturn语句语句:使程序流程从函数调用中返回,表达使程序流程从函数调用中返回,表达式的值就是函数调用的返回值。式的值就是函数调用的返回值。n如果函数没有返回值(返回类型为如果函数没有返回值(返回类型为void时),则时

    6、),则return语句中的表达式省略。语句中的表达式省略。5.1.1 函数的定义函数的定义main()()Y=f(2);int f(int x)return x*x;4.形式参数表形式参数表 指明该函数所需要的若干参数和这些参数的类指明该函数所需要的若干参数和这些参数的类型,各参数之间用逗号分开。型,各参数之间用逗号分开。形式参数表的格式:形式参数表的格式:类型类型1 形参形参1,类型类型2 形参形参2,类型类型n 形参形参n5.1.1 函数的定义函数的定义int max(int x1,int x2).int max(int x1,x2).error 4.形式参数表形式参数表 函数无参数时函数

    7、无参数时:形式参数表为空形式参数表为空(void)。例如:例如:5.1.1 函数的定义函数的定义 f()等同于:等同于:f(void)5.1.1 函数的定义函数的定义函数的声明格式函数的声明格式:返回值类型返回值类型 函数名(函数名(形式参数表形式参数表)语句序列语句序列 5.函数头与函数体函数头与函数体函数头:定义了函数的功能是什么,怎样调用它。函数头:定义了函数的功能是什么,怎样调用它。函数体:定义功能的具体实现过程代码。调用时,函数体:定义功能的具体实现过程代码。调用时,只需关心函数头,而无需关心函数体。只需关心函数头,而无需关心函数体。函数头函数头函数体函数体5.1.2 函数的调用函数

    8、的调用n函数定义好后,就可以被其它函数调用函数定义好后,就可以被其它函数调用被调用的函数叫做被调用的函数叫做Called,调用者叫做,调用者叫做Calling。1.函数调用的一般格式:函数调用的一般格式:函数名(实参表)函数名(实参表)实参表是用逗号分开的实参。实参表是用逗号分开的实参。(1)实参表与形参表匹配:实参表与函数定义中实参表与形参表匹配:实参表与函数定义中形参表的形参类型和形参个数要一一匹配。形参表的形参类型和形参个数要一一匹配。5.1.2 函数的调用函数的调用long Factor(int n)long Factor(int n).函数调用形式函数调用形式:k=Factor(5)

    9、;K=Factor(5.0)float max(float x1,float x2)函数调用形式函数调用形式:float x=10.0f;y=89.7f,z=-78.7f;m=max(x,y);m=max(x,y,z);m=max(max(x,y),z);m=max(2,3);m=max(2.0,3);m=max(2.0f,3);例如例如:2.0 类型类型doublex5.1.2 函数的调用函数的调用(1)函数的调用无返回值(返回类型函数的调用无返回值(返回类型void),函数调用可函数调用可作为一条语句单独出现。作为一条语句单独出现。void printHello()void printHe

    10、llo()函数调用形式函数调用形式:printHello();例如例如:5.1 函数的定义与调用函数的定义与调用n书写函数时注意:书写函数时注意:(1)程序中如果定义了多个函数,这些函数定)程序中如果定义了多个函数,这些函数定义在书写上应该是并列的关系,而不是嵌套义在书写上应该是并列的关系,而不是嵌套的关系。的关系。例如例如,一个源程序有三个函数组成一个源程序有三个函数组成:void f1(float x)void f2(int x)int main()int main()void f1(float x)void f2(int x)5.1 函数的定义与调用函数的定义与调用n书写函数注意点:书写

    11、函数注意点:(2)遵循)遵循“函数定义在前、调用在后函数定义在前、调用在后”原则。原则。n如果如果“函数调用在前、定义在后函数调用在前、定义在后”,则函数调,则函数调用之前必须书写用之前必须书写函数原型函数原型。n函数原型函数原型的格式的格式:函数头函数头;例如:例如:void f1(float x);或或 void f1(float);n在函数原型中形式参数的名字可以不写。在函数原型中形式参数的名字可以不写。5.1 函数的定义与调用函数的定义与调用n书写函数时要注意点:书写函数时要注意点:例如,函数定义在前,函数调用在后的情形:例如,函数定义在前,函数调用在后的情形:void f1(floa

    12、t x)void f2(int x)int main()float a=3.0;f1(2.0);f2(a);5.1 函数的定义与调用函数的定义与调用n书写函数时要注意点:书写函数时要注意点:例如,函数定义在后,函数调用在前的情形:例如,函数定义在后,函数调用在前的情形:void f1(float);/函数原型函数原型,省略了形参名,省略了形参名void f2(int x);/函数原型函数原型int main()f1(2.0f);f2(10);void f1(float x)/函数定义函数定义void f2(int x)/函数定义函数定义函数定义,函数原型,函数调用有啥区别?函数定义,函数原型,

    13、函数调用有啥区别?5.1 函数的定义与调用函数的定义与调用n函数调用的执行过程函数调用的执行过程:例例5-1 编写求编写求xn的函数。的函数。n解题思路:求解题思路:求xn的函数定义为函数:的函数定义为函数:double power(double x,int n)int i;double xn=1;for(i=1;i=n;i+)xn*=x;return xn;void main()int n;double x;printf(x,n=?);scanf(%lf,%d,&x,&n);printf(%.4fn,power(x,n);x,n=?12.5,2156.2500double power(dou

    14、ble x,int n)int i;double xn=1;for(i=1;i=n;i+)xn*=x;return xn;例例5-2 输出输出10000之内的所有完全数。之内的所有完全数。n解题思路解题思路:完全数是指等于其所有因子和(包括完全数是指等于其所有因子和(包括1但不包但不包括这个数本身)的数。括这个数本身)的数。例如,例如,6123,6123,则,则6是完全数是完全数1.定义两个函数:定义两个函数:int isPerfect(int x),用于判断,用于判断x是否完全数;是否完全数;void displayPerfect(int x),用于输出,用于输出x的因子之和的的因子之和的式

    15、子。式子。2.在在main()函数中使用一个函数中使用一个for循环,检查循环,检查1到到10000之之间的所有整数是否为完全数。间的所有整数是否为完全数。#include int isPerfect(int x);/函数原型,判断函数原型,判断x是否完全数是否完全数void displayPerfect(int x);/函数原型,输出函数原型,输出x的因子之和的公式的因子之和的公式void main()int x;for(x=1;x10000;x+)if(isPerfect(x)displayPerfect(x);int isPerfect(int x)int y=0,i;/y存放因子之和存

    16、放因子之和for(i=1;ix;i+)if(x%i=0)/i是是x的因子时,加到的因子时,加到yy+=i;if(y=x)return 1;elsereturn 0;void displayPerfect(int x)/输出输出x的因子之和的公式的因子之和的公式 int i;printf(%d=,x);for(i=1;ix;i+)if(x%i=0)if(i!=1)printf(+);printf(%d,i);printf(n);printf(i=1?%d:+%d,i);5.2 函数的参数传递函数的参数传递n函数的调用者如何将实际参数值传递给函数的调用者如何将实际参数值传递给被调用者?被调用者?n

    17、C语言的参数传递方式:语言的参数传递方式:n按值传递按值传递n按地址传递。按地址传递。nC+语言增加:语言增加:n按引用传递按引用传递5.2.1 按值传递按值传递n按值传递:按值传递:n当函数的形参为非指针类型时,则此形参是当函数的形参为非指针类型时,则此形参是值参数。值参数。n函数调用时,将实参的值传递给对应的形参。函数调用时,将实参的值传递给对应的形参。n单方向传递。不会因为被调用函数中对形参单方向传递。不会因为被调用函数中对形参值的改变而影响实参的值。值的改变而影响实参的值。5.2.1 按值传递按值传递例例5-3 按值传递的例子。按值传递的例子。void swap(int x,int y

    18、)int hold;hold=x;x=y;y=hold;printf(x=%d,y=%dn,x,y);void main()int a=1,b=2;swap(a,b);printf(a=%d,b=%dn,a,b);x=2,y=1a=1,b=2xab1212y实参形参传值5.2.2 按地址传递按地址传递 n按地址传递:按地址传递:n当函数的形参为指针类型时,则当函数的形参为指针类型时,则形参是地址变量。形参是地址变量。n函数调用时,是将实参的地址传递给对应的形参指函数调用时,是将实参的地址传递给对应的形参指针变量。针变量。void swap(int*x,int*y)swap(&a,&b)给形参传

    19、是变量的地址值给形参传是变量的地址值5.2.2 按地址传递按地址传递例例5-4利用地址参数将两变量的值进行交换。利用地址参数将两变量的值进行交换。void swap(int*x,int*y)int hold;hold=*x;*x=*y;*y=hold;printf(x=%d,y=%dn,*x,*y);void main()int a=1,b=2;swap(&a,&b);printf(a=%d,b=%dn,a,b);x=2,y=1a=2,b=1实参:实参:12a(1000)b(1004)&b形参:形参:&axy*x *y给形参传的值是变量的地址给形参传的值是变量的地址5.2.2 按地址传递按地址

    20、传递n地址形参对应的实际参数是变量地址。地址形参对应的实际参数是变量地址。n在子函数的函数体中,使用指针取内容在子函数的函数体中,使用指针取内容运算。运算。如:如:*xn给形参指向的实参对象赋新值,从而改变实给形参指向的实参对象赋新值,从而改变实参的值。参的值。例例5-5 定义一函数求一元二次方程的实根。定义一函数求一元二次方程的实根。n解题思路:定义求实根的函数解题思路:定义求实根的函数:int computRoots(double a,double b,double c,double*x1,double*x2)n参数参数a,b,c是值参是值参nx1,x2是地址参数,用以返回两实根是地址参数

    21、,用以返回两实根n返回类型返回类型int,标志一元二次方程是否有实根,标志一元二次方程是否有实根n当返回结果为当返回结果为0时,无实根时,无实根n当返回结果为当返回结果为1时,有相同的两个实根时,有相同的两个实根n当返回结果为当返回结果为2时,有不同的两个实根时,有不同的两个实根int computRoots(double,double,double,double*,double*);/函数原型函数原型int main()double a,b,c;double x1,x2;int flag;printf(Input a,b,c?);scanf(%lf,%lf,%lf,&a,&b,&c);fla

    22、g=computRoots(a,b,c,&x1,&x2);if(flag=0)printf(此方程没有实根,或此方程不是一元二次方程此方程没有实根,或此方程不是一元二次方程.n);else printf(此方程实根为:此方程实根为:x1=%8.4f,x2=%8.4fn,x1,x2);int computRoots(double a,double b,double c,double*x1,double*x2)int result;double t;if(fabs(a)1e-6)/判断判断a=0,result=0;/方程不是一元二次方程方程不是一元二次方程 else t=b*b-4*a*c;if(

    23、fabs(t)1e-6)/当当t0 有两个不同的实根有两个不同的实根 *x1=(-b+sqrt(t)/(2.0*a);*x2=(-b-sqrt(t)/(2.0*a);result=2;else /无实根无实根 result=0;return result;Input a,b,c?1,-4,3此方程实根为:此方程实根为:x1=3.0000,x2=1.000005.2.3 按引用传递按引用传递(c+中提供中提供)1.引用型变量的概念引用型变量的概念 引用变量是另一个变量的别名。引用变量是另一个变量的别名。声明语句声明语句:类型类型&变量名变量名 例如例如:int n;int&m=nn当声明一个引用

    24、型变量时,需要用一个已存在的变当声明一个引用型变量时,需要用一个已存在的变量对它进行初始化。量对它进行初始化。105.2.3 按引用传递按引用传递1.引用型变量的概念引用型变量的概念例如例如:int n;int&m=n;m是变量是变量n的别名的别名 对变量对变量m的访问相当于对变量的访问相当于对变量n的访问的访问 给给n分配存储单元分配存储单元,m使用使用n的存储单元的存储单元 m=10;相当于:相当于:n=10;mn5.2.3 按引用传递按引用传递2.函数的引用形参函数的引用形参n当函数的参数为引用类型时,则对形参的任何访当函数的参数为引用类型时,则对形参的任何访问等同于对实参的访问问等同于

    25、对实参的访问n按引用传递是按引用传递是C+增加的参数类型,增加的参数类型,n源文件的后缀名一定要为源文件的后缀名一定要为.cpp,而不能为,而不能为.c。void swap(int&x,int&y)例例5-6利用引用参数将两变量的值进行交换利用引用参数将两变量的值进行交换n定义一函数实现两个变量值的交换,并带有两定义一函数实现两个变量值的交换,并带有两个引用参数的:个引用参数的:void swap(int&x,int&y)n调用语句调用语句 swap(a,b);注意:注意:引用形参对应的实参引用形参对应的实参,是一般的变量是一般的变量,而,而不是变量的地址。不是变量的地址。/ch5_6.cpp

    26、#include void swap(int&x,int&y)int hold;hold=x;x=y;y=hold;void main()int a=1,b=2;printf(a=%d,b=%dn,a,b);swap(a,b);printf(a=%d,b=%dn,a,b);a=1,b=2;a=2,b=15.3 函数嵌套与递归函数嵌套与递归n嵌套:在一个函数定义的函数体中直接嵌套:在一个函数定义的函数体中直接调用了另外一个函数。调用了另外一个函数。n递归:在一个函数定义的函数体中直接递归:在一个函数定义的函数体中直接或间接地调用了自身函数。或间接地调用了自身函数。5.3 函数嵌套与递归函数嵌套与

    27、递归5.3 函数嵌套与递归函数嵌套与递归5.3 函数嵌套与递归函数嵌套与递归n递归技术递归技术n解决问题时采用解决问题时采用“依此类推依此类推”、“用同样的用同样的步骤重复步骤重复”的思想,的思想,定义自身中又用到了自身:定义自身中又用到了自身:n!=n*(n-1)!n用简单的程序来解决复杂计算问题,但是运用简单的程序来解决复杂计算问题,但是运算量较大。算量较大。几个递归定义的例子几个递归定义的例子 例例5-7 用递归法求阶乘用递归法求阶乘n!。!。求求n!的递归函数定义:!的递归函数定义:long Factorial(int n)if(n=1)return 1;else return n*F

    28、actorial(n-1);递归终结点递归终结点递归调用递归调用自身自身调用语句调用语句y=Factorial(5);的执行过程;的执行过程(a)递归调用次序 (b)递归调用返回值例例5-7用递归法求组合数。用递归法求组合数。n解题思路:解题思路:n定义求组合数的函数:定义求组合数的函数:int comb(int m,int n)n组合函数组合函数 的递归定义:的递归定义:组合数的概念组合数的概念n从从m个不同元素中,任取个不同元素中,任取n(mn)个元素并成一组,叫做个元素并成一组,叫做从从m个不同元素中取出个不同元素中取出n个元素的一个组合;个元素的一个组合;n表示为:表示为:n Cmn=

    29、Pmn/n!=m!/(n!(m-n)!)例例5-8用递归法求组合数。用递归法求组合数。void main()int Comb(int m,int n);/函数原型函数原型int m,n;printf(m=);scanf(%d,&m);printf(n=);scanf(%d,&n);printf(Comb(%d,%d)=%dn,m,n,Comb(m,n);例例5-8用递归法求组合数。用递归法求组合数。int Comb(int m,int n)if(n=0|m=n)return 1;/结束递归的条件结束递归的条件else if (n=1)return m;/结束递归的条件结束递归的条件else i

    30、f(n 1)/递归调用递归调用Comb函数自身函数自身 return Comb(m-1,n-1)+Comb(m-1,n);else printf(n不能为负不能为负n);return-1;m=4n=2Comb(4,2)=65.4 返回指针类型的函数返回指针类型的函数n函数的返回值为指针类型函数的返回值为指针类型n从函数调用后返回指向数据的指针或地址。从函数调用后返回指向数据的指针或地址。n定义返回指针类型的函数形式:定义返回指针类型的函数形式:类型名类型名*函数名函数名(参数表列参数表列)例例5-9返回指针类型的函数应用实例。返回指针类型的函数应用实例。n要求定义一函数要求定义一函数:int*

    31、pf(int x,int y,int*z)将将x、y相加的结果的数据地址放入相加的结果的数据地址放入z变量中,变量中,同时也作为函数的返回结果。同时也作为函数的返回结果。int*pf(int x,int y,int*z)int*p;p=z;*p=x+y;/将将x、y相加的结果的地址放入相加的结果的地址放入z指针变量指针变量return p;/返回相加的结果地址返回相加的结果地址void main()int a=10,b=20,c;int*p;p=pf(a,b,&c);/p指向变量指向变量c printf(“c=%d,*p=%dn”,c,*p);/输出数据输出数据c与与*p相同相同c=30,*p

    32、=30P是局部变量,为什么可以返回?是局部变量,为什么可以返回?5.5 指向函数的指针指向函数的指针n前面我们介绍了前面我们介绍了指向数据的指针指向数据的指针 例如:例如:int*pi;double*pd;n对程序中定义的每一函数也要分配一段存储空间,用对程序中定义的每一函数也要分配一段存储空间,用以存放函数的代码。以存放函数的代码。n函数名函数名:代表函数代码在内存中的起始地址。代表函数代码在内存中的起始地址。n指向函数的指针指向函数的指针:用来存放函数代码首地址的变量。:用来存放函数代码首地址的变量。又称为函数指针。又称为函数指针。n声明函数指针的格式:声明函数指针的格式:返回类型返回类型

    33、(*函数指针名函数指针名)(形参表)(形参表)5.5 指向函数的指针指向函数的指针1.声明一个函数指针的语法格式为:声明一个函数指针的语法格式为:返回类型返回类型(*函数指针名)(函数指针名)(形参表形参表)(1)返回类型:)返回类型:说明函数指针指向的函数的返回类型是什么?说明函数指针指向的函数的返回类型是什么?(2)(形参表形参表):说明函数指针指向的函数的形参表类型和个数;:说明函数指针指向的函数的形参表类型和个数;(3)(*函数指针名函数指针名):园括号中表示的函数指针名:园括号中表示的函数指针名 例如:例如:int (*p)(int,int);定义定义p是指向函数的指针变量,指向返回

    34、类型为是指向函数的指针变量,指向返回类型为int、有两个、有两个int参数的函数。参数的函数。p的类型用的类型用 int(*)(int,int)表示。表示。5.5 指向函数的指针指向函数的指针 2.声明了函数指针之后,要对函数指针赋值,声明了函数指针之后,要对函数指针赋值,语法格式:语法格式:函数指针名函数指针名=函数名;函数名;n赋值号右边的函数名,要与函数指针的类型相同赋值号右边的函数名,要与函数指针的类型相同(即具有相同的返回类型和形参表)(即具有相同的返回类型和形参表)例如:例如:int add(int x,int y)return x+y;int(*p)(int,int);p=add

    35、;5.5 指向函数的指针指向函数的指针 3.通过函数指针名调用指向的函数。通过函数指针名调用指向的函数。调用语法格式:调用语法格式:函数指针名(实参表)函数指针名(实参表)或或 (*函数指针名)(实参表)函数指针名)(实参表)例如:调用函数例如:调用函数add的形式:的形式:p(2,3)或或 (*p)(2,3)等同于等同于 add(2,3)例例5-10 通过函数指针实现加减计算器。通过函数指针实现加减计算器。int sub(int x,int y);/函数原型函数原型int add(int x,int y);void main()int a=10,b=20,c;int menu;int(*p)

    36、(int,int);printf(1-addn2-subnYour selection:);scanf(%d,&menu);if(menu=1)p=add;else p=sub;c=p(a,b);/或者或者c=(*p)(a,b)printf(c=%d ,(*p)(a,b)=%dn,c,(*p)(a,b);int sub(int x,int y)return x-y;int add(int x,int y)return x+y;5.6 变量的作用域与可见性变量的作用域与可见性n变量的作用域:变量的有效访问范围变量的作用域:变量的有效访问范围n变量的可见性:变量是否能被访问。变量的可见性:变量是否

    37、能被访问。n变量只有在其作用域内才能可见。变量只有在其作用域内才能可见。例如,我们在某个函数中声明的变量就例如,我们在某个函数中声明的变量就只能在这个函数中使用,这就是受变量只能在这个函数中使用,这就是受变量的作用域与可见性的限制。的作用域与可见性的限制。5.6.1 变量的作用域变量的作用域n变量作用域的基本规则:变量作用域的基本规则:(1)块作用域)块作用域 或或 函数作用域函数作用域 在函数体内或函数中的某代码块内声明的变在函数体内或函数中的某代码块内声明的变量,被称为量,被称为局部变量局部变量(Local variable)。局部变量的作用域局部变量的作用域:它所在的代码块:它所在的代码

    38、块(整个函整个函数或函数中的某代码块数或函数中的某代码块)。5.6.1 变量的作用域变量的作用域n变量作用域的基本规则:变量作用域的基本规则:(2)文件作用域)文件作用域 在函数的外面声明的变量被称为全局变量在函数的外面声明的变量被称为全局变量(Global variable)。)。全局变量的作用域是整个文件。全局变量的作用域是整个文件。当前文件下的所有函数都能访问全局变量。当前文件下的所有函数都能访问全局变量。int sum=0;/声明全局变量声明全局变量sum void f1(int x,int y)/声明参数声明参数x,y int i=1;/声明局部变量声明局部变量i sum+=x+y+

    39、i;/将结果值赋给全局变量将结果值赋给全局变量sum void f2(int x)sum+=x;/将将x加到全局变量加到全局变量sum i=10;/错误!错误!i变量未声明变量未声明void main()f1(1,2);f2(3);printf(“%d”,sum);sum的的作用域作用域5.6.1 变量的作用域变量的作用域n变量的作用域的基本规则:变量的作用域的基本规则:(3)函数原型作用域)函数原型作用域n是是c语言最小的作用域。语言最小的作用域。n函数原型中声明的形式参数的作用域就是函数原函数原型中声明的形式参数的作用域就是函数原型。即函数形参表的左、右园括号之间。型。即函数形参表的左、右

    40、园括号之间。n书写函数原型时通常可以只声明形参的类型,形书写函数原型时通常可以只声明形参的类型,形参的名字可任意命名或不写。参的名字可任意命名或不写。例如:例如:float max(float x,float y);或者或者 float max(float,float);5.6.2 变量的可见性变量的可见性n变量的可见性变量的可见性:是指程序运行到某一处,:是指程序运行到某一处,能够访问该变量,就说在该处是变量可见的。能够访问该变量,就说在该处是变量可见的。n作用域与可见性的一般规则作用域与可见性的一般规则:(1)变量必先声明,然后才能使用)变量必先声明,然后才能使用(2)在同一作用域下,不能

    41、声明两个同名的变)在同一作用域下,不能声明两个同名的变量;量;(3)在没有相互包含关系的不同作用域中定义)在没有相互包含关系的不同作用域中定义的同名变量,互不影响;的同名变量,互不影响;(4)如果函数中的局部变量或参数与全局变量)如果函数中的局部变量或参数与全局变量同名,则全局变量将被同名,则全局变量将被“屏蔽屏蔽”(暂不可见),(暂不可见),直到块结束。直到块结束。例例5-11 同名变量可见性应用例子。同名变量可见性应用例子。#include int sum=0;void main()char b=A;int sum=2;int b=3;printf(b=%d,used the varibl

    42、e b of inner block.n,b);printf(b=%c,used the varible b of main.n,b);printf(sum=%d,used the varible sum of main.n,sum);printf(sum=%d,used sum of global variable.n,sum);内块内块外块外块文件域文件域5.7 变量的存储类型和生存期变量的存储类型和生存期n5.7.1变量的生存期变量的生存期n变量的生存期:一个变量从被声明且分变量的生存期:一个变量从被声明且分配存储空间开始,一直到被释放空间为配存储空间开始,一直到被释放空间为止的时间。止

    43、的时间。n全局变量的生存期:程序的整个运行过程。全局变量的生存期:程序的整个运行过程。n函数中的局部变量:在调用该函数时临时分函数中的局部变量:在调用该函数时临时分配空间,在该函数调用结束后局部变量的空配空间,在该函数调用结束后局部变量的空间也就释放了,即局部变量不存在了。间也就释放了,即局部变量不存在了。5.7.2 变量的存储类型变量的存储类型n变量的存储类型变量的存储类型nauto 自动类型(自动类型(缺省缺省)nregister 寄存器类型寄存器类型nstatic 静态类型静态类型nExtern 外部类型。外部类型。5.7.2 变量的存储类型变量的存储类型n变量的存储类型变量的存储类型(

    44、1)auto自动类型(自动类型(缺省缺省)auto是变量的默认存储类型。是变量的默认存储类型。自动类型变量定义在块内。自动类型变量定义在块内。自动变量的生存期和作用域是一致的。自动变量的生存期和作用域是一致的。例如例如:int fun(int x)auto int a,b=10;.a和和b是自动变量。执行函数是自动变量。执行函数fun时自动分配时自动分配a和和b的存的存储空间,执行完储空间,执行完fun后,自动释放后,自动释放a和和b的存储空间。的存储空间。5.7.2 变量的存储类型变量的存储类型n变量的存储类型变量的存储类型(2)寄存器类型)寄存器类型(register)变量变量 用用reg

    45、ister修饰的变量。修饰的变量。例如:例如:register int r;n寄存器类型的变量是局部变量。系统尽可能将寄存器类型的变量是局部变量。系统尽可能将此类型的变量值保放在此类型的变量值保放在CPU的寄存器中,以提的寄存器中,以提高程序的运行速度高程序的运行速度.5.7.2 变量的存储类型变量的存储类型n变量的存储类型变量的存储类型 (3)静态类型()静态类型(static)变量)变量用用static修饰的变量。修饰的变量。例如:例如:static int s;n静态变量的生存期:是整个程序的执行过程。静态变量的生存期:是整个程序的执行过程。n静态变量占用的空间要到程序运行结束时才静态变

    46、量占用的空间要到程序运行结束时才被释放。被释放。n如果程序未初始化静态变量,那么系统将其如果程序未初始化静态变量,那么系统将其初始化为初始化为0,且且初始化值只进行一次初始化值只进行一次。5.7.2 变量的存储类型变量的存储类型n静态类型(静态类型(static)变量)变量n根据静态变量定义的位置不同,分为静态局根据静态变量定义的位置不同,分为静态局部变量和静态全局变量部变量和静态全局变量n静态局部变量静态局部变量:在函数体内或块内用:在函数体内或块内用static修饰的局部变量。修饰的局部变量。n静态局部变量的值,在函数调用结束后一直保留,静态局部变量的值,在函数调用结束后一直保留,即存放其

    47、值空间在函数调用结束后不会被释放,即存放其值空间在函数调用结束后不会被释放,在下次调用此函数时静态局部变量是上一次函数在下次调用此函数时静态局部变量是上一次函数调用结束时的值。调用结束时的值。n静态全局变量静态全局变量:用:用static修饰的全局变量。修饰的全局变量。n全局静态变量的作用域只限于本文件模块全局静态变量的作用域只限于本文件模块(即被即被声明的文件中声明的文件中)。例例5-12 静态变量的应用例子。静态变量的应用例子。static char x;/声明静态全部变量声明静态全部变量xvoid fun()static int a=2;/声明静态局部变量声明静态局部变量aint b=2

    48、;/声明局部变量声明局部变量ba+;b+;printf(a=%d,b=%dn,a,b);void main()fun();fun();fun();printf(x=%dn,x);a=3,b=3a=4,b=3a=5,b=3x=05.6.2 变量的存储类型变量的存储类型(4)外部类型()外部类型(extern)变量)变量 用用extern修饰的变量。修饰的变量。例如:例如:extern s;extern一般用来修饰全局变量,用于在相关的一般用来修饰全局变量,用于在相关的一组源文件中共享一组变量。一组源文件中共享一组变量。5.8 C程序的多文件结构程序的多文件结构n一个一个C程序可由多个源文件构成。

    49、程序可由多个源文件构成。n在在Visual studio集成环境下,表现为集成环境下,表现为n一个项目可包含多个源文件。一个项目可包含多个源文件。n一个源文件可由多个函数组成,一个源文件可由多个函数组成,n一个项目的多个源文件中只能有一个一个项目的多个源文件中只能有一个main函数,函数,n如何在多个源文件中共享一组全局变量,如何在多个源文件中共享一组全局变量,用用extern关键字。关键字。Visual studio的一个项目包含多个源的一个项目包含多个源文件视图文件视图 例例5-13 在在C程序的两个源文件程序的两个源文件file1.c和和file2.c中,共享变量中,共享变量s。文件文件

    50、file1.c的内容:的内容:int s=1;/声明全局变量声明全局变量s,分配存储空间,分配存储空间 void setS(int x)s=x;文件文件file2.c的内容:的内容:#include extern s;/对外部变量对外部变量s说明说明main()int x;printf(s=%dn,s);setS(5);printf(s=%dn,s);s=1s=55.9 编译预处理编译预处理(preCompile)n编译器在对源程序编译之前,首先要由预处理编译器在对源程序编译之前,首先要由预处理程序对源程序进行预处理。程序对源程序进行预处理。n预处理程序的主要任务预处理程序的主要任务:处理源程

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《C语言程序设计实用教程》课件第5章 函数.ppt
    链接地址:https://www.163wenku.com/p-5787113.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库