作用域与存储类型课件

上传人:石磨 文档编号:282241652 上传时间:2022-04-25 格式:PPT 页数:30 大小:1.47MB
返回 下载 相关 举报
作用域与存储类型课件_第1页
第1页 / 共30页
作用域与存储类型课件_第2页
第2页 / 共30页
作用域与存储类型课件_第3页
第3页 / 共30页
作用域与存储类型课件_第4页
第4页 / 共30页
作用域与存储类型课件_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《作用域与存储类型课件》由会员分享,可在线阅读,更多相关《作用域与存储类型课件(30页珍藏版)》请在金锄头文库上搜索。

1、第第5章章 作用域和存储类型作用域和存储类型5.1 作用域作用域5.2 变量的存储类型变量的存储类型5.3 编译预处理编译预处理5.1.1 作用域作用域作用域是变量在程序中可引用的区域。作用域是变量在程序中可引用的区域。作用域共分成作用域共分成块作用域、文件作用域、函数声明块作用域、文件作用域、函数声明(原型)作用域、函数作用域、类作用域(原型)作用域、函数作用域、类作用域五种。五种。1 1块作用域块作用域 复合语句是一个块。复合语句是一个块。复合语句中定义的变量,作用域仅在该复合语句复合语句中定义的变量,作用域仅在该复合语句中。中。5.1.1 作用域作用域【例例5.1】 输入两数,按从大到小

2、的顺序保存,并输出结果。输入两数,按从大到小的顺序保存,并输出结果。#includevoid 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已经无效已经无效5.1.1 作用域作用域2 2文件作用域文件作用域 文件作用域也称全局作用域。定义在所有函文件作用域也称全局作用域。定义在所有函数之外的变量,具有文件作用域,作用域为从定数之外的变量,具有文件作用域,作用域

3、为从定义处到整个源文件结束。文件中定义的全局变量义处到整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。和函数都具有文件作用域。3 3函数声明作用域函数声明作用域 函数声明不是定义函数,在作函数声明时,函数声明不是定义函数,在作函数声明时,其中的形参作用域只在声明中,即作用域结束于其中的形参作用域只在声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名用,所以通常只要声明形参个数和类型,形参名可省略。可省略。 5.1.1 作用域作用域4 4函数作用域函数作用域 函数中定义的变量,包括形参和

4、函数体中定函数中定义的变量,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函义的局部变量,作用域都在该函数内,也称作函数域。数域。5 5类作用域类作用域 在介绍类和对象时,可知类作用域是指类定在介绍类和对象时,可知类作用域是指类定义范围(包括类的声明部分和相应成员函数实现义范围(包括类的声明部分和相应成员函数实现整个范围)。在该范围内,类的成员函数对数据整个范围)。在该范围内,类的成员函数对数据成员有无限访问权限。成员有无限访问权限。5.1.2 局部变量与全局变量局部变量与全局变量一、局部变量一、局部变量 下列变量是局部变量:下列变量是局部变量:1 1、在一个函数内部定义的变、在

5、一个函数内部定义的变量;量;2 2、函数的形式参数、函数的形式参数 ; 3 3、在某个复合语句中定义的、在某个复合语句中定义的变量;变量; float f1(int a) int b,c; Void main() int m,n; b,c有效有效m,n有效有效a有效有效main() int a,b,c; int d; d=a+b; d有效有效5.1.2 局部变量与全局变量局部变量与全局变量一、局部变量一、局部变量 说明:说明:、局部变量只在自己、局部变量只在自己范围内有效;范围内有效;2 2、如果局部变量的有效、如果局部变量的有效范围有重叠,则有效范范围有重叠,则有效范围小的优先;围小的优先;

6、 main() int a,b,c; int c; c=a+b; 局部优先局部优先C有效有效二、全局变量二、全局变量 5.1.2 局部变量与全局变量局部变量与全局变量在函数之外定义的变量(外部在函数之外定义的变量(外部变量)是全局变量变量)是全局变量 全局变量的有效范围是:从从定义变量的位置开始到源文定义变量的位置开始到源文件结束件结束 7.7 局部变量与全局变量局部变量与全局变量二、全局变量二、全局变量 例:编写一个函数实现同时返回例:编写一个函数实现同时返回10个数的最大和个数的最大和最小值最小值分析:用一个函数返回两个数据,除了用函数值外,分析:用一个函数返回两个数据,除了用函数值外,可

7、以借助于全局变量可以借助于全局变量 可见,全局变量可以减少函数的参数可见,全局变量可以减少函数的参数 5.1.2 局部变量与全局变量局部变量与全局变量#include #include #include int min; /全局变量全局变量minint find( ) int max,x; x=rand( )%101+100; /产生一个产生一个100, 200之间的随机数之间的随机数x printf(“ %d”,x); max = x; min =x; / 设定最大数和最小数设定最大数和最小数 for(int i=1;i max) max = x; / 若新产生的随机数大于最大数,若新产生的

8、随机数大于最大数,则进行替换则进行替换 if(x min)min = x; / 若新产生的随机数小于最小数,若新产生的随机数小于最小数,则进行替换则进行替换 return max;void main( ) int m=find( ); printf(“n最大数:最大数:%d,最小最小数数:%dn“,max,min); 7.7 局部变量与全局变量局部变量与全局变量二、全局变量二、全局变量 说明:说明:、利用全局变量可以在函、利用全局变量可以在函数间传递参数。数间传递参数。、应尽量少用全局变量、应尽量少用全局变量、如果全局变量与局部变、如果全局变量与局部变量同名,则量同名,则局部变量优先局部变量优

9、先 5.1.3 动态变量与静态变量动态变量与静态变量全局变量和局部变量全局变量和局部变量 :变量的变量的作用域作用域静态存储变量和动态存储变量:静态存储变量和动态存储变量:变量的存储类别变量的存储类别 ,即,即生存期生存期 内存中供用户使用的存储内存中供用户使用的存储空间包括:空间包括:程序区程序区 静态存储区:编译时分配空静态存储区:编译时分配空间间动态存储区:执行时分配空动态存储区:执行时分配空间间 变量或函数的属性:变量或函数的属性: 作业:作业:P90:四、:四、3、4P108:一、:一、25.2 变量的存储类别变量的存储类别1、自动类型:、自动类型:存储在动态存储区,用存储在动态存储

10、区,用auto说明说明 如:如:int func1(int a) auto int b,c=3; 通常通常auto可以省略可以省略 形参形参a,变量,变量b、c都是自动变量调都是自动变量调用该函数时,系统给它们分配存储用该函数时,系统给它们分配存储空间,函数调用结束时自动释放存空间,函数调用结束时自动释放存储空间。储空间。 自动类型、寄存器类型的变量属于自动类型、寄存器类型的变量属于动态变量动态变量;静态类型、外部类型的变量属于静态类型、外部类型的变量属于静态变量静态变量。5.2 变量的存储类别变量的存储类别1、自动类型、自动类型:【例例5.5】使用自动变量的示例。使用自动变量的示例。#inc

11、lude 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); 5.2 变量的存储类别变量的存储类别2、寄存器类型(、寄存器类型(register) 计算机中的寄存器的个数是有限的计算机中的寄存器的个数是有限的 寄存器变量对寄存器的占用是动态的寄存器变量对寄存器的占用是动态的 有的系统将寄存器变量转化为自动变有的系统将寄存器变量转化为自动变量处理,而有的系统会自动设置寄存器量处理,而有的系统会自动设置寄

12、存器变量变量 5.2 变量的存储类别变量的存储类别3、静态类型、静态类型(static) 静态局部变量属于静态存储类别,静态局部变量属于静态存储类别,在程序整个运行期间都不释放存储在程序整个运行期间都不释放存储空间。空间。静态局部变量在编译时赋初值静态局部变量在编译时赋初值(仅赋一次值)(仅赋一次值) 如果定义静态局部变量时没有赋如果定义静态局部变量时没有赋初值,编译时会自动赋初值初值,编译时会自动赋初值 静态局部变量只能在定义它的函静态局部变量只能在定义它的函数内被引用数内被引用(它存在但不能被其它(它存在但不能被其它函数使用)函数使用) 打印打印1到到5的阶乘的阶乘(1)静态局部变量)静态

13、局部变量5.2 变量的存储类别变量的存储类别【例例5.6】自动变量与静态局部变量的区别。自动变量与静态局部变量的区别。#include 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 ( ); 5.2 变量的存储类别变量的存储类别【例例例例5.75.7】用自动变量与静

14、态局部变量求三个整数的和。用自动变量与静态局部变量求三个整数的和。用自动变量与静态局部变量求三个整数的和。用自动变量与静态局部变量求三个整数的和。 #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=%dn“,m,n);void main( ) int i=5,j=10,k; for (k=1;k=3;k+) f(i,j);5.2 变量的存储类别变量的存储类别(2)静态全局变量)静态全局变量 在定义全局变量时也加

15、说明符在定义全局变量时也加说明符在定义全局变量时也加说明符在定义全局变量时也加说明符staticstatic。 程序由一个源程序文件实现,程序由一个源程序文件实现,程序由一个源程序文件实现,程序由一个源程序文件实现,一个全局变量和一个静态全局变量一个全局变量和一个静态全局变量一个全局变量和一个静态全局变量一个全局变量和一个静态全局变量是没区别的。是没区别的。是没区别的。是没区别的。 在多文件组成的程序中,一个在多文件组成的程序中,一个在多文件组成的程序中,一个在多文件组成的程序中,一个全局变量和一个静态全局变量在使全局变量和一个静态全局变量在使全局变量和一个静态全局变量在使全局变量和一个静态全

16、局变量在使用上是不同的,其他文件通过外部用上是不同的,其他文件通过外部用上是不同的,其他文件通过外部用上是不同的,其他文件通过外部变量声明可以使用一个全局变量,变量声明可以使用一个全局变量,变量声明可以使用一个全局变量,变量声明可以使用一个全局变量,但却无法使用静态全局变量,静态但却无法使用静态全局变量,静态但却无法使用静态全局变量,静态但却无法使用静态全局变量,静态全局变量只能被定义它的文件所独全局变量只能被定义它的文件所独全局变量只能被定义它的文件所独全局变量只能被定义它的文件所独享。享。享。享。特点:特点:1)与全局变量基本相同,只是)与全局变量基本相同,只是其作用范围(即作用域)是定义其作用范围(即作用域)是定义它的程序文件,而不是整个程序。它的程序文件,而不是整个程序。(2)静态全局变量属于静态存)静态全局变量属于静态存储类别的变量,所以它在程序一储类别的变量,所以它在程序一开始运行时,就被分配固定的存开始运行时,就被分配固定的存储单元,所以其生存期是整个程储单元,所以其生存期是整个程序运行期间。序运行期间。(3)使用静态全局变量的好处)使用静态全局变量的好处是同一程序的两个

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号