1、第 1 页 12006-2007 学年 第一学期 教案 NO._20_ 教研室:基础 教师:黄春芳学科名称:C 语言基础授课章节题目或课题: 第十章 函数(三)本次授课属于: 理论课 上机课 习题课 计论课 其它授课班级 授课日期 节次 变动说明06 计 2 第_19 周 星期_一_ 第 1,2节06 计 1 第_18 周 星期_四_ 第 1,2节执行情况教学目的 要求1,复习函数参数传递的方式,函数的嵌套和递归调用2,了解变量的存储类型3,学会定义各种不同存储类型的变量4,了解变量的生存期重点 1,各种不同存储类型变量的异同2,变量的生存期难点及解决措施静态变量的特点解决:通过具体案例来说明
2、作业 习题册后记 第一节课讲解习题,花费了比较长的时间,导致后来上存储类型部分的时候很匆忙,下次还需要特别复习一下。第 2 页 2宁 波 大 红 鹰 职 业 技 术 学 院 教 案 专 用 纸教 学 过 程 与 内 容 备 注一、 复习回顾 复习函数参数传递的两种方式: 值传递和地址传递复习函数调用的两种方式: 嵌套调用和递归调用二、授课内容10.4 变量的作用域变量使用的有效范围称为变量的作用域。1、变量只能在它的作用范围内使用,即变量在它的作用域之外不能被引用。2、变量的作用域直接与变量定义的位置相关。1)、在函数内部(或复合语句内部)定义的变量称为内部变量。内部变量的作用域是定义它的函数
3、(或复合语句) 。2)、在函数外任意位置定义的变量称为外部变量。外部变量的作用域是从定义或声明的位置开始,直至它所在源程序文件的结束(如果声明在函数内,则只在函数内有效) 。3、作用域不同的同名变量有时会出现作用域的部分重叠,这时系统通常都选择作用域范围小的变量有效。【例】请根据变量作用域规则和参数传递的原则分析程序的执行结果。 #include int a=1,b=2; /*外部变量 a,b*/int f1( int a) /*内部变量 a*/ int b=10; /*内部变量 b*/printf(“%d %dn”,a,b); /*这里的 a,b 是内部变量 a 和 b*/return (a
4、*b); /*这里的 a,b 是 f1 内的内部变量 a 和b*/main( )printf(“%d %dn”,a,b); /*这里的 a,b 是外部变量 a 和 b*/printf(“%dn”,f1(a+b); /*这里的 a,b 是外部变量 a 和 b*/程序的运行结果:1 23 10304、内部变量的特性有助实现信息隐蔽,即使不同的函数定义了同名的内部变量,也不会相互影响。而外部变量的使用增加了函数之间传递数据的途径。如果一个函数需要返回两个或两个以上的计算结果时,可以使用外部变量传递数据。在复习过程中,要涵盖各个知识点说明变量存储类型的重要性和必要性详细解释这个程序第 4 页 4第 5
5、 页 5宁 波 大 红 鹰 职 业 技 术 学 院 教 案 专 用 纸教 学 过 程 与 内 容 备 注10.5 变量的存储类别1、根据变量在程序运行期间是否需占用固定的存储单元,变量的存储类别可分为两类:(1)动态存储类别:程序运行期间不需要长期占用内存单元。动态存储类别的变量有 auto(自动) 类型和 register(寄存器)类型。(2)静态存储类别:静态存储类别的变量在编译时被分配空间,在整个程序运行期间一直占用固定的内存空间,程序运行结束才释放内存空间。可以用 static、extern 定义和声明静态存储类别的变量。2、程序运行时占用的内存空间通常分为程序区、静态存储区和动态存储
6、区三部分。3、动态存储类别的变量可存放在两个地方:动态存储区和寄存器。4、静态存储类别的变量只能存放存放于静态存储区中。5、定义变量时需要说明存储类别。因此,完整的变量定义形式应为:存储类别 数据类型 变量列表;10.5.1 内部变量的存储类别1、auto(自动)变量(1) 、C 系统默认的内部变量的存储类型是 auto 类型。(2)自动变量在其定义所在的函数(或复合语句)开始执行时才分得内存空间,在该函数(或复合语句)执行期间占用内存空间。在函数(或复合语句)执行结束时自动变量占用的空间被系统收回。【举例】注意变量的存储类别。2、register(寄存器)变量(1)register 变量和
7、auto 变量不同之处在于 register 变量被存放在寄存器中,因此比 auto 变量存取速度快的多。通常将频繁使用的变量放在寄存器中,以提高程序的执行速度。(2)计算机中寄存器的数量是有限的,而且寄存器的数据长度也是有限的。因此 register 变量不能定义太多,也不能是数据类型太大的变量。(3)现今 register 变量定义通常是不必要的。优化的编译系统能够识别使用频繁的变量,并将其放到寄存器之中。3、static (静态)变量(1)static 变量存放在内存的静态存储区。static 内部变量在整个程序运行期间占用固定的内存单元。(2)再次调用 static 内部变量所在函数时
8、,static 内部变量的值为上次调用结束时的值。(3)系统在编译时为 static 变量分配空间并赋初值,对未赋值的内部 static 数值型变量,系统自动给它赋值为 0。因为在编译期间赋初值,所以只能赋一次初值。在概念解释的同时举例说明各种不同存储类型变量的区分第 1 页 1宁 波 大 红 鹰 职 业 技 术 学 院 教 案 专 用 纸教 学 过 程 与 内 容 备 注(4)注意:static 内部变量的作用域仍然是定义该变量的函数体(或复合语句)内部。虽然 static 变量在整个程序运行期间都是存在的,但在它的作用域外,它仍是不可被引用的。【例】编程序比较内部 auto 变量和内部 s
9、tatic 变量的不同。10.5.2 外部变量的存储类别1、外部变量的定义(1)外部变量只能是静态存储的变量,存放在内存的静态存储区内。外部变量在整个程序的运行期间一直占用固定的内存单元。(2)外部变量分类:如果定义外部变量时用 static 定义,则虽然该变量在程序的运行期间一直存在,但只能被其所在文件中的函数所使用,不能被其他文件中的函数使用。如果定义外部变量时不用 static,该变量能被其他文件中的函数使用。2、外部变量的声明(extern 声明)(1)C 语言用 extern 标识符声明外部变量。(2)对外部变量的声明可以在函数的内部,也可以在函数的外部。(3)从外部变量的定义位置开始到该文件的结束的这段区域内无需对外部变量声明,可直接使用。(4)必须通过声明方可使用外部变量的情况:【例】注意 x,y 的说明与定义。#include extern int x,y; /*外部变量 x、y 的声明*/main( ) printf(“%dn“,mul(x,y); int x=2,y=5; /*外部变量 x、y 的定义*/int mul(int a,int b) return(a*b); 复习回顾要求同学们自学外部函数举例说明