《(中职)C语言程序设计案例教程第5章函数(5-6节)教学课件().ppt》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计案例教程第5章函数(5-6节)教学课件().ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、(中职)C 语言程序设计案例教程第5 章函数(5-6 节)教学课件(工信版)CONTENTS目录5.5 变量的存储类别5.6内部函数和外部函数5.7 常见错误分析与解决123 本节要点:掌握C 语言变量的作用域和存储类别。理解内部函数和外部函数。P AR T5.5 变量的存储类别5变量的存储:变量占用单元的时间称为“生存期”,变量的生存期是由变量的存储位置决定的。程序中使用的数据可存放在CPU的寄存器和内存储器中。CPU寄存器中存储的数据是动态存储类型,不能长期占用。内存中分为两个区域,分别是静态存储区和动态存储区。其中,静态存储区存放的数据可以在程序执行期间长期占有内存单元,直到该程序结束;
2、动态存储区存放的数据是临时占用内存单元,当某一程序段执行完毕,系统回收内存单元。程序中使用的数据存放在哪个存储区是用户在定义变量时指定的。01020304056定义变量的存储类型:存储类型 存储类型符 存储位置自动类型 auto 内存动态存储区寄存器类型 register CPU 寄存器静态变量 static 静态存储区外部变量 extern 静态存储区表5-1数据的存储类型及存储位置5.5.1 动态存储在函数中定义变量时,在数据类型前面可加auto 修饰符,表示该变量为自动变量,如“autointa;”。一般省略auto。自动变量的作用域范围只限在变量所在的程序块,程序执行退出了该程序块,自
3、动变量的存储空间就被释放掉。自动变量也是动态的局部变量。(1)自动变量(auto)自动变量是存储在堆区和栈区的变量,随函数调用而生成,随函数调用结束而释放,C 语言从存储的角度称这些变量为自动变量。8(2)寄存器变量(register)寄存器变量使用的是CPU 的寄存器,寄存器变量与一般自动变量相比,它可以提高存取速度一个数量级或更多。定义格式为:register 类型名 变量名;只有局部自动变量和形式参数可以作为寄存器变量,提高程序的运行速度。不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。不能对寄存器变量进行取址运算。例:#includevoidmain()registeri
4、nti=0;/寄存器变量doublesign=1.0,res=0,ad=1.0;for(i=1;i=100000000;i+)res+=ad;sign=-sign;ad=sign/(2*i+1);res*=4;printf(piis%fn,res);5.5.2 静态存储(1)静态变量(static)静态变量存放在静态存储区中。静态变量在变量定义时就分配了固定的内存单元,并根据所定义的数据类型存入默认值,在程序运行中一直占用内存单元不释放,直到程序运行结束才释放。11静态变量分类:静态变量又分为静态局部变量和静态全局变量。0102静态局部变量是在函数或复合语句中定义的静态变量,该变量在其函数中或
5、复合语句中有效。静态局部变量所在的函数无论调用多少次,静态局部变量初始化一次,可以保留函数多次调用的中间结果,相互保持了程序的独立性。使用关键字“static”定义的全局变量称为静态全局变量,该变量只在本文件中有效,其他的文件不可以使用此变量,这一特点不同于外部变量。03例:5-11:静态变量实例。#includevoidincrement()staticintx=0;x=x+1;printf(“静态变量x的值是%dn”,x);voidmain()increment();increment();increment();13(2)外部变量(extern):外部变量是定义在函数外部的全局变量,它的
6、作用域为从变量定义处开始,到本程序文件的末尾。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。也可用static 声明外部变量,使该变量不能被其他文件引用。1 2 3例:在同一程序文件中使用外部变量#includeintX,Y;intmax(intx,inty)intz;z=xy?x:y;returnz;voidmain()/*主函数*/externA,B;printf(“%dn”,max(A,B);intA=13,B=-8;例:5-12:外部变
7、量实例。文件1 为file1.c#includeinti=100,j=200;/*定义外部变量*/charc;voidfunc1(intk);func2();voidmain()func1(20);/*调用函数*/func2();voidfunc1(intk)/*用户定义函数*/j=k*100;printf(j=%dn,j);文件2 为file2.c#includeexterninti,j;/*说明将i,j 从文件1 中复制过来*/externcharc;/*将c复制过来*/func2()/*用户定义函数*/staticfloatk;/*定义静态变量*/i=j*5/100;k=i/1.5f;p
8、rintf(i=%dn,i);printf(j=%dn,j);printf(k=%fn,k);16外部变量使用注意:extern既可以用来扩展外部变量在本文件中的作用域,也可以使外部变量的作用域从一个文件扩展到程序所涉及的其他文件,系统处理的过程是在编译时遇到extern时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域。如果找不到,就在连接时从其他文件中找外部变量的定义,如果找到,就将作用域扩展到本文件。如果找不到,就按出错处理。外部变量的优先级低于局部变量。外部变量可以使用,但是外部变量使用时应注意的是尽可能使其名字易于理解,而且不能太短。另外因为执行一个文件中的函数时,可
9、能改变了该外部变量的值,它会影响到另一个文件中的函数执行结果。P AR T5.6内部函数和外部函数18函数分类:根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。内部函数只能被本文件中其他函数所调用。格式为:static 类型标识符 函数名(形参表)例如:staticintfun(inta,intb)5.6.1 内部函数外部函数是可以被其他文件中函数调用的函数格式为:externintfun(inta,intb);5.6.2 外部函数P AR T5.7 常见错误分析与解决22常见错误:(1)没有包含被调用的函数所属的文件。(2)没有包含库函数所在的头文件。(3)没有对所调用的函数进行函数原型声明。(4)调用自定义函数时,实参和形参类型不一致。(5)函数中使用变量未赋值、未进行初始化。(6)自定义函数数据类型与返回值的数据类型不一致。通过本节学习重点理解和掌握的知识有:(1)理解和区别动态存储和静态存储类别的概念。(2)理解自动变量,寄存器变量的存储类别。(3)理解静态变量,外部变量的存储类别。(4)能够在程序中分析自动变量,寄存器变量值的变化。(5)能够在程序中分析静态变量,外部变量的值的变化。(6)了解内部函数和外部函数的概念和应用方法。本节小结