《第5章作用域与存储类型.ppt》由会员分享,可在线阅读,更多相关《第5章作用域与存储类型.ppt(30页珍藏版)》请在优知文库上搜索。
1、5.1 作用域作用域5.2 变量的存储类型变量的存储类型5.3 编译预处理编译预处理作用域是变量在程序中可引用的区域。作用域是变量在程序中可引用的区域。作用域共分成作用域共分成块作用域、文件作用域、函数声明块作用域、文件作用域、函数声明(原型)作用域、函数作用域、类作用域(原型)作用域、函数作用域、类作用域五种。五种。1 1块作用域块作用域 复合语句是一个块。复合语句是一个块。复合语句中定义的变量,作用域仅在该复合语句复合语句中定义的变量,作用域仅在该复合语句中。中。【例例5.1】输入两数,按从大到小的顺序保存,并输出结果。输入两数,按从大到小的顺序保存,并输出结果。#includevoid
2、main()int a,b;/a、b具有函数作用域具有函数作用域 cout输入两整数:输入两整数:ab;cout“a=atb=b=a)int t;/t具有块作用域具有块作用域 t=a;a=b;b=t;/交换交换a,b的值的值 couta=atb=bendl;/t已经无效已经无效2 2文件作用域文件作用域 文件作用域也称全局作用域。定义在所有函文件作用域也称全局作用域。定义在所有函数之外的变量,具有文件作用域,作用域为从定数之外的变量,具有文件作用域,作用域为从定义处到整个源文件结束。文件中定义的全局变量义处到整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。和函数都具有文件作用域。3
3、 3函数声明作用域函数声明作用域 函数声明不是定义函数,在作函数声明时,函数声明不是定义函数,在作函数声明时,其中的形参作用域只在声明中,即作用域结束于其中的形参作用域只在声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名用,所以通常只要声明形参个数和类型,形参名可省略。可省略。4 4函数作用域函数作用域 函数中定义的变量,包括形参和函数体中定函数中定义的变量,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函义的局部变量,作用域都在该函数内,也称作函数域。数域。5 5类作用域类作用域
4、 在介绍类和对象时,可知类作用域是指类定在介绍类和对象时,可知类作用域是指类定义范围(包括类的声明部分和相应成员函数实现义范围(包括类的声明部分和相应成员函数实现整个范围)。在该范围内,类的成员函数对数据整个范围)。在该范围内,类的成员函数对数据成员有无限访问权限。成员有无限访问权限。一、局部变量一、局部变量 下列变量是局部变量:下列变量是局部变量:1 1、在一个函数内部定义的变、在一个函数内部定义的变量;量;2 2、函数的形式参数、函数的形式参数 ;3 3、在某个复合语句中定义的、在某个复合语句中定义的变量;变量;float f1(int a)int b,c;Void main()int m
5、,n;b,c有效有效m,n有效有效a有效有效main()int a,b,c;int d;d=a+b;d有效有效一、局部变量一、局部变量 说明:说明:、局部变量只在自己、局部变量只在自己范围内有效;范围内有效;2 2、如果局部变量的有效、如果局部变量的有效范围有重叠,则有效范范围有重叠,则有效范围小的优先;围小的优先;main()int a,b,c;int c;c=a+b;局部优先局部优先C有效有效二、全局变量二、全局变量 在函数之外定义的变量(外在函数之外定义的变量(外部变量)是全局变量部变量)是全局变量 全局变量的有效范围是:从从定义变量的位置开始到源文定义变量的位置开始到源文件结束件结束
6、二、全局变量二、全局变量 例:编写一个函数实现同时返回例:编写一个函数实现同时返回10个数的最大和个数的最大和最小值最小值分析:用一个函数返回两个数据,除了用函数值外,分析:用一个函数返回两个数据,除了用函数值外,可以借助于全局变量可以借助于全局变量 可见,全局变量可以减少函数的参数可见,全局变量可以减少函数的参数#include#include#include int min;/全局变量全局变量minint find()int max,x;x=rand()%101+100;/产生一个产生一个100,200之间的随机数之间的随机数x printf(“%d”,x);max=x;min=x;/设定
7、最大数和最小数设定最大数和最小数 for(int i=1;i max)max=x;/若新产生的随机数大于最大数,若新产生的随机数大于最大数,则进行替换则进行替换 if(x min)min=x;/若新产生的随机数小于最小数,若新产生的随机数小于最小数,则进行替换则进行替换 return max;void main()int m=find();printf(“n最大数:最大数:%d,最小最小数数:%dn“,max,min);二、全局变量二、全局变量 说明:说明:、利用全局变量可以在函、利用全局变量可以在函数间传递参数。数间传递参数。、应尽量少用全局变量、应尽量少用全局变量、如果全局变量与局部变、如
8、果全局变量与局部变量同名,则量同名,则局部变量优先局部变量优先 全局变量和局部变量全局变量和局部变量 :变量的变量的作用域作用域静态存储变量和动态存储变量:静态存储变量和动态存储变量:变量的存储类别变量的存储类别,即,即生存期生存期 内存中供用户使用的存储内存中供用户使用的存储空间包括:空间包括:程序区程序区 静态存储区:编译时分配空静态存储区:编译时分配空间间动态存储区:执行时分配空动态存储区:执行时分配空间间 变量或函数的属性:变量或函数的属性:externregisterstaticauto外部型寄存器型静态型自动型存储类别数据类型P90:四、:四、3、4P108:一、:一、21、自动类
9、型:、自动类型:存储在动态存储区,用存储在动态存储区,用auto说明说明 如:如:int func1(int a)auto int b,c=3;通常通常auto可以省略可以省略 形参形参a,变量,变量b、c都是自动变量调都是自动变量调用该函数时,系统给它们分配存储用该函数时,系统给它们分配存储空间,函数调用结束时自动释放存空间,函数调用结束时自动释放存储空间。储空间。自动类型、寄存器类型的变量属于自动类型、寄存器类型的变量属于动态变量动态变量;静态类型、外部类型的变量属于静态类型、外部类型的变量属于静态变量静态变量。1、自动类型、自动类型:【例例5.5】使用自动变量的示例。使用自动变量的示例。
10、#include void main()int x=5,y=10;/自动变量x,y for(int k=1;k=2;k+)auto int m=0,n=0;/自动变量m,n m=m+1;n=n+x+y;printf(m=%dtn=%dn“,m,n);2、寄存器类型(、寄存器类型(register)计算机中的寄存器的个数是有限的计算机中的寄存器的个数是有限的 寄存器变量对寄存器的占用是动态的寄存器变量对寄存器的占用是动态的 有的系统将寄存器变量转化为自动变有的系统将寄存器变量转化为自动变量处理,而有的系统会自动设置寄存器量处理,而有的系统会自动设置寄存器变量变量 3、静态类型、静态类型(stat
11、ic)静态局部变量属于静态存储类别,静态局部变量属于静态存储类别,在程序整个运行期间都不释放存储在程序整个运行期间都不释放存储空间。空间。静态局部变量在编译时赋初值静态局部变量在编译时赋初值(仅赋一次值)(仅赋一次值)如果定义静态局部变量时没有赋如果定义静态局部变量时没有赋初值,编译时会自动赋初值初值,编译时会自动赋初值 静态局部变量只能在定义它的函静态局部变量只能在定义它的函数内被引用数内被引用(它存在但不能被其它(它存在但不能被其它函数使用)函数使用)打印打印1到到5的阶乘的阶乘(1)静态局部变量)静态局部变量【例例5.6】自动变量与静态局部变量的区别。自动变量与静态局部变量的区别。#in
12、clude void f()int x=0;/初始化多次,栈中分配、相当于初始化多次,栈中分配、相当于auto int x=0;static int y=3;/静态局部变量,仅初始化一次,静态区分配静态局部变量,仅初始化一次,静态区分配 x=x+1;y=y+1;printf(“%dt%dn”,x,y);void main()int i;for(i=0;i3;i+)f();#include void f(int x,int y)int m=0;/自动变量 static int n=0;/静态局部变量,此处也可static int n;m=m+x+y;n=n+x+y;printf(m=%dtn=%
13、dn“,m,n);void main()int i=5,j=10,k;for(k=1;k=3;k+)f(i,j);(2)静态全局变量)静态全局变量特点:特点:1)与全局变量基本相同,只是)与全局变量基本相同,只是其作用范围(即作用域)是定其作用范围(即作用域)是定义它的程序文件,而不是整个义它的程序文件,而不是整个程序。程序。(2)静态全局变量属于静态存)静态全局变量属于静态存储类别的变量,所以它在程序储类别的变量,所以它在程序一开始运行时,就被分配固定一开始运行时,就被分配固定的存储单元,所以其生存期是的存储单元,所以其生存期是整个程序运行期间。整个程序运行期间。(3)使用静态全局变量的好处
14、)使用静态全局变量的好处是同一程序的两个不同的源程是同一程序的两个不同的源程序文件中可以使用相同名称的序文件中可以使用相同名称的变量名,而互不干扰。变量名,而互不干扰。(2)静态全局变量)静态全局变量【例例5.8】编写一个含两个源程序文件程序(多文件程序见编写一个含两个源程序文件程序(多文件程序见5.4节)。在节)。在file2.c文件中定义静态全局变量文件中定义静态全局变量n,在含有,在含有main函数的函数的file1.c文件中又定义全文件中又定义全局变量局变量n,分析两者是否有联系?,分析两者是否有联系?/file1.c#includeint n;void fn();void main(
15、)n=20;printf(“%dn”,n);fn();/file2.c#include /不能省略不能省略static int n;/定义静态全局变量定义静态全局变量nvoid fn()n=n+1;printf(“%dn”,n);4、外部类型、外部类型(extern)定义格式:定义格式:extern 类型类型 变量名变量名;在由多个源程序文件组成的程序中,如果一个文件要在由多个源程序文件组成的程序中,如果一个文件要使用另一个文件中定义的全局变量,这些源程序文件之间使用另一个文件中定义的全局变量,这些源程序文件之间通过通过外部类型的变量进行沟通外部类型的变量进行沟通。在一个文件中定义的全局变量缺
16、省为外部的,即其作在一个文件中定义的全局变量缺省为外部的,即其作用域可以延伸到程序的其他文件中。但其他文件如果要使用域可以延伸到程序的其他文件中。但其他文件如果要使用这个文件中定义的全局变量,必须在使用前用用这个文件中定义的全局变量,必须在使用前用“extern”作外部声明,外部声明通常放在文件的开头。作外部声明,外部声明通常放在文件的开头。4、外部类型、外部类型(extern)【例例5.9】将另一文件中的全局变量将另一文件中的全局变量a,b定义为本文件外部变量的定义为本文件外部变量的示例。示例。第一个文件内容如下:第一个文件内容如下:/*文件名:文件名:exemple5_9_1.c*/int a=20,b=7;/全局变量全局变量a,bint max(int x,int y)return xy?x:y;第二个文件内容如下:第二个文件内容如下:/*文件名:文件名:exemple5_9_2.c*/#include extern int a,b;/外部变量外部变量a,bextern int max(int x,int y);void main()int c;c=max(a,b);printf