内容正文:
课程单元教案
本课编号
19
本课课时
2学时
内容提要
项目6 函数应用
任务5 变量作用域和变量存储类别
教学目的
1、掌握局部变量和全局变量的定义、语法和功能;
2、掌握动态变量和静态变量的定义、语法和功能。
知识能力
结构
掌握局部变量和全局变量的用法;掌握动态变量和静态变量的用法。
教学重点
难点
重点:变量作用域
难点:变量存储类别。
教学手段
方法
教学方法:项目任务驱动教学法、提问式、启发式
教学手段:课堂讲授法、操作演示法、多媒体教学
思考题与
习题
1、局部变量和全局变量的区别。
2、动态变量和静态变量的区别。
教学内容进程设计
项目导入:综合实践6 学生成绩管理系统功能模块化设计
项目描述:利用自定义函数将学生成绩管理系统中的功能独立出来,进行模块化设计。
问题导入:全局变量在学生成绩信息系统功能模块化设计中的应用?
根据课前预习及搜集的资料,对函数的概念有一个初步的了解,以方便进行下面知识内容的学习。
任务5 变量作用域和变量存储类别
5.1 局部变量和全局变量
C语言中的变量,按作用域范围可分为:局部变量和全局变量。
1. 局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的,其作用域仅限于函数内。
说明:
(1)所有函数中定义的局部变量,都只能在本函数中使用。主函数中定义的变量也只能在主函数中使用,同时,主函数中也不能使用其它函数中定义的变量。
(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。
(4)在复合语句中也可定义变量,其作用域只在复合语句范围内。
例1:局部变量的使用。
main(){
int i=2,j=3,k;
k=i+j;
{int k=8;
printf("%d
",k);}
printf("%d
",k);}
结论:第一个k输出结果是8,第二个k输出结果所示5,同一个变量名作用域不同。
2. 全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。全局变量不属于任何一个函数,其作用域是整个源程序。
说明:(1)在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量将被屏蔽而不起作用。
(2)如果全局变量定义点之前的函数需要引用这些变量,应在函数内对被引用的全局变量进行说明。说明的一般形式为:
extern 数据类型 全局变量[,全局变量2……];
例:输入长方体的长(l)、宽(w)、高(h),求长方体体积及表面积。
#include<stdio.h>
int s,v;
void vs(int a,int b,int c)
{ v=a*b*c;
s=2*(a*b+b*c+a*c); }
main()
{ int l,w,h;
printf("
input length,width and height: ");
scanf("%d%d%d",&l,&w,&h);
vs(l,w,h);
printf("v=%d s=%d
",v,s);}
变量v,s为全局变量,作用域包括两个函数。
例:全局变量的定义与说明。
int vs(int xl,int xw)
{ extern int xh; /*全局变量xh的说明*/
int v;
v=xl*xw*xh; /*直接使用全局变量xh的值*/
return v; }
main()
{ extern int xw,xh; /*全局变量的说明*/
int xl=5; /*局部变量的定义*/
printf("xl=%d,xw=%d,xh=%d,v=%d",xl,xw,xh,vs(xl,xw)); }
int xl=3,xw=4,xh=5; /*全局变量xl、xw、xh的定义*/
全局变量xl,xw,xh定义在函数后面,需要使用关键字extern进行作用域扩充说明。
例:全局变量与局部变量同名。
int a=3,b=5; /*a,b为全局变量*/
max(int a,int b) /*a,b为局部变量*/
{ int c;
c=a>b?a:b;
return(c);}
main()
{ int a=8;
printf("%d
",max(a,b));}
变量a和b既有全局变量定义,又有局部变量定义。当变量同名,在应用中局部变量优先于全局变量。
5.2 动态变量和静态变量
1.变量分类
变量按照存储位置不同可分为:动态存储变量和静态存储变量。
2. 自动变量(auto)
定义格式:[auto] 数据类型 变量表;
说明:(1)函数及复合语句中的局部变量,如没有声明为static存储类别,都是动态分配存储空间的。
(2)在调用函数时系统会给自动变量分配存储空间,函数调用结束时自动释放。
(3)定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。
3. 静态局部变量
定义格式: static 数据类型 变量表;
例:自动变量与静态局部变量的存储特性。
void auto_static(void)
{ int var_auto=0; /*动态变量:每次调用都重新初始化*/
static int var_static=0; /*静态局部变量:只初始化1次*/
printf("var_auto=%d,var_static=%d
",var_auto, var_static);
++var_auto;
++var_static; }
main()
{ int i;
for(i=0; i<5; i++)
auto_static(); }
说明:(1)静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。
(2)定义时自动赋以0值(整型和实型)或‘\0’(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值。
4. 静态全局变量和非静态全局变量
全局变量全部存放在静态存储区,在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。可分为两种:
(1)静态全局变量──只允许被本源文件中的函数引用
格式:static 数据类型 全局变量表;
(2)非静态全局变量──允许被其它源文件中的函数引用
格式:数据类型 全局变量表;
其它源文件中的函数,引用非静态全局变量时,需要在引用函数所在的源文件中进行说明:
extern 数据类型 全局变量表;
在函数内的extern变量说明,表示引用本源文件中的全局变量;
而函数外(通常在文件开头)的extern变量说明,表示引用其它文件中的全局变量。
5. 动态存储方式和静态存储方式的比较
static对局部变量和全局变量的作用不同:
(1)对局部变量 : 使动态存储方式改变为静态存储 ;
(2)对全局变量 : 使变量局部化,但仍为静态存储 ;
(3)凡有 static 说明的,其作用域都是局限的。
例:静态变量的使用。
main()
{ int f(int a);
int a=1,i;
for(i=0;i<3;i++)
printf("%4d",f(a)); }
int f(int a)
{ int b=0;
static int c=3;
b++;c++;
return(a+b+c); }
从运行结果可以看出,函数f中定义的变量c为静态变量,其值在上次调用结束会保留结果。
例:静态变量和全局变量的使用。
#include "stdio.h"
int n=1;
void func(){
static int x=4;
int y=10;
x=x+2;
n=n+10;
y=y+n; }
main(){
static int x=5;
int y;
y=n;
func();
printf("n=%d
",n);
func();
printf("n=%d
",n); }
n为全局变量,作用域是两个函数。变量x分别在两个函数中定义,为静态局部变量,分别在各自函数中有效。
随堂实训练习:读程序题,判断结果。
教学小结
1.掌握全局变量和局部变量的特点和区别;
2.掌握动态变量和静态变量的特点和区别。
学科网(北京)股份有限公司
$$