第8章 用户标识符的作用域和存储类别_第1页
第8章 用户标识符的作用域和存储类别_第2页
第8章 用户标识符的作用域和存储类别_第3页
第8章 用户标识符的作用域和存储类别_第4页
第8章 用户标识符的作用域和存储类别_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 用户标识符的作用域和存储类别 8.1 局部变量和全局变量 8.2 局部变量的作用域和生存期 8.3 全局变量的作用域和生存期 8.4 函数的存储类别本章主要内容问题的提出一个语言程序在运行时所用的存储空间,通常包括以下三部分: 程序区 静态存储区 动态存储区 8.1 局部变量和全局变量变量的作用域(scope)程序中定义变量的位置及其能被读写访问的范围。局部变量 Local Variable全局变量Global Variable8.1 局部变量和全局变量8.1.1 局部变量局部变量 (内部变量) :在函数(或复合语句)内部定义的变量。局部变量的作用域仅限于该函数(或复合语句)内部。离开

2、该函数(或复合语句),其值就不能再引用。8.1 局部变量和全局变量【例8.1】内部变量应用样例。8.1 局部变量和全局变量int f( int a)a=a+4; rerun a;main( ) int a;a=3;printf(“%dn”,f(a);printf(“%d”,a);形参a的作用范围局部变量a的作用范围8.1 局部变量和全局变量程序说明main函数及f函数中都定义了变量a。虽然变量名相同,但却占用不同的内存空间,起作用的范围也不同,即各自在所定义的函数中有效。形参也是局部变量。局部变量的作用域是包围着该变量定义的大括号 之内,超出这个范围 , 局部变量就不能使用了。8.1 局部变量

3、和全局变量8.1.2 全局变量全局变量 (外部变量 ):在所有函数外部定义的变量。全局变量的作用域:是从定义变量的位置开始到本程序文件的末尾。8.1 局部变量和全局变量【例8.2】全局变量应用样例。8.1 局部变量和全局变量int a,b; /* 定义全局变量a, b */float fun1(int i)float fun2(int j) char c1,c2; /* 定义全局变量c1,c2 */float fun3(int z) main()局部变量i的作用域局部变量j的作用域局部变量z的作用域全局变量c1、c2的作用域全局变量a、b的作用域8.1 局部变量和全局变量程序说明:在fun1和

4、fun2函数中,只能使用全局变量a、b。在fun3和main函数中,可以使用全局变量a、b、c1、c2。如果一个全局变量与另一个函数中的局部变量同名,则全局变量将在该函数中被屏蔽掉,即在该函数内局部变量有效,全局变量不起作用。8.2局部变量的作用域和生存期C语言中的变量可有种不同的存储类型:自动型(auto)寄存器型(register)静态型(static)外部型或全局型(extern)8.2局部变量的作用域和生存期8.2.1 auto变量自动变量说明的一般格式为:auto 数据类型 变量名=初值,; auto可以省略int a,b;auto int a,b; 等价8.2局部变量的作用域和生存

5、期 【例8.3】阅读下面程序,分析运行结果。8.2局部变量的作用域和生存期f(int a)auto int b=0; auto int c=3;b=b+1;c=c+1;return a+b+c;main( ) int a=2,i; for(i=0,i3;i+) printf(“%dn”,f(a); b为自动类变量,初值为0。它等价于int b=0 定义c为动态类变量,初值为3定义a为自动类变量,初值为2输出调用f函数之后的结果运行结果: 7 7 7 8.1 局部变量和全局变量程序说明:在main函数中三次调用了f函数。每次调用时都要为局部变量a、b和c分配内存单元,且a的值为实参传过来的2,b

6、和c的值为0和3。调用结束时,局部变量a、b和c占用的内存空间被释放。下一次调用时再重新分配。8.2 局部变量的作用域和生存期8.2.2 register变量 register 型变量也称为寄存器变量 , 它是与硬件相关的一类变量。寄存器变量也是动态变量。它与auto变量的区别仅在于:前者在CPU的寄存器中开辟存储空间,而后者在普通内存中分配。通常都把使用频繁的变量定义为寄存器变量8.2 局部变量的作用域和生存期一般数据类型为 long 、 float 和 double 的变量不能定义为寄存器类型 , 因为这些数据类型的长度超过了寄存器本身的长度。通常只有 int 、 short 和 char

7、 类型的变量才准许定义为寄存器类型。寄存器变量是局部变量,它的作用域同 auto 型变量一样。它的作用域是整个函数,其生命期是函数的每次调用。8.2 局部变量的作用域和生存期寄存器变量定义的格式为:register 数据类型 变量名表;【例8.4】使用register变量,编写mypower函数,用来计算xn。 8.2局部变量的作用域和生存期8.2局部变量的作用域和生存期main( ) int x , n , s;printf(Input x and n: );scanf(%d%d,&x,&n); s=mypower(x,n); printf(%dn,s);mypower( int x , i

8、nt n) register int i , y=1;for( i=1;i=n;i+) y=y*x; return y;用循环变量i和存放连乘积的变量y被定义为register变量,以加快求值速度。 程序运行结果如下:Input x and n: 5 31258.2局部变量的作用域和生存期程序说明: CPU中寄存器的数目是有限的,应少定义变量为该类型。 register类变量没有地址,不能对它进行求地址运算。 register类变量的声明应尽量靠近其s使用的地方,用完之后尽快释放,以便提高寄存器的利用率。8.2 局部变量的作用域和生存期静态内部变量一旦其所在的函数被调用,其生命期将一直延续到整

9、个程序的结束。内部静态变量若没有初始化,则系统将赋以0值;而动态变量为随机数。 内部变量即可以定义为动态存储类别,也可以定义为静态存储类别,其作用域都是在定义它的函数内部。8.2局部变量的作用域和生存期静态变量定义的一般形式为: static 数据类型 变量名表;8.2 局部变量的作用域和生存期【例8.5】静态局部变量应用样例。分析下面程序的运行结果。8.2局部变量的作用域和生存期 int f( )int a2; static int b, c=3; b=b+1;c=c+1;return a+b+c;main( ) int i; for(i=0;i3;i+) printf(%4d,f( );

10、a为动态变量,初值为2定义b,c为静态类变量,初值为0 , 3程序的运行结果如下:7 9 118.2局部变量的作用域和生存期程序说明:main函数中的变量i,f函数中的变量a都是auto型的动态变量。 f函数中b和c变量都是静态内部变量,在编译时系统为它们开辟存储空间,并赋初值0和3。 8.3 全局变量的作用域和生存期全局变量只能是静态存储类别。对于全局变量可使用extern和static两种说明符。定义格式为:extern static 数据类型 变量名表;没有特别指明存储类型的全局变量,默认为:extern(外部)。8.3全局变量的作用域和生存期8.3.1 全局变量的作用域和生存期在所有函

11、数外部定义的变量称为全局变量(外部变量)。全局变量的作用域,是从定义变量的位置开始到本程序文件的结束。 8.3全局变量的作用域和生存期【例8.6】阅读下面程序,分析输出结果。8.3全局变量的作用域和生存期int sum;void fun( );main( ) sum=10; printf(*main(1)*:%dn,sum); fun( ); printf(*main(2)*:%dn,sum); void fun( ) sum=20; printf(* fun *:%dn,sum);程序运行结果如下: *main(1)*:10 * fun *:20 *main(2) *:108.3全局变量的作

12、用域和生存期程序说明: 在main函数中两次输出的sum值应是在该函数中定义的内部变量sum,所以均输出10。而在fun函数中输出的sum应是全局变量sum。8.3全局变量的作用域和生存期8.3.2 在同一编译单位内使用extern说明符 若全局变量的定义在后,引用它在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。 8.3全局变量的作用域和生存期说明的格式为: extern 数据类型 全局变量名;8.3全局变量的作用域和生存期【例8.7】阅读下面程序,分析输出结果。8.3全

13、局变量的作用域和生存期#include extern int n; void fun( ) n-=20;int n=100; main( ) for(; n=60;) fun( ); printf(n=%dn,n); 全局变量的声明全局变量的定义程序的运行结果如下:n=80n=60n=408.3全局变量的作用域和生存期程序说明:全局变量的定义与说明不是一回事:定义只能有一次,定义的同时为变量分配内存单元,而全局变量说明是为了要引用该变量而作的一个声明,不分配内存单元。全局变量说明可进行多次。8.3全局变量的作用域和生存期8.3.3 在不同编译单位内使用extern说明符程序说明:当在一个源文件

14、中定义的全局变量,在其他源文件中要使用时,应该在该文件中对该变量进行声明,声明的格式是:extern 数据类型 全局变量名;8.3全局变量的作用域和生存期【例8.8】不同源文件中外部全局变量的引用样例。8.3全局变量的作用域和生存期file1.c源程序为: int i, j; mian( ) fun( ) 定义了外部变量i和j8.3全局变量的作用域和生存期fiel2.c的源程序为:extern int i , j; f1( ) j= i*i+1; f2( ) printf(“%d %d”,i,j); 对file1.c中定义的外部变量进行说明对file1.c中定义的外部变量进行引用对file1.

15、c中定义的外部变量进行引用8.3全局变量的作用域和生存期8.3.4 静态全局变量 在定义全局变量时,若明确指明其存储类型为静态,则称其为静态外部变量。否则为外部全局变量。静态全局变量的作用域只限于该变量所在的源文件,源文件中所有的函数都可以引用它,而其它源文件不能使用。8.3全局变量的作用域和生存期静态全局变量的定义格式为:static 数据类型 变量名表;如: static float f1, f2;8.3全局变量的作用域和生存期【例8.9】静态全局变量的引用样例。8.3全局变量的作用域和生存期file1.c源程序为: static int i, j; mian( ) j= i+1; fun

16、( ) j= i+2; 定义静态全局变量i和j 8.3全局变量的作用域和生存期 fiel2.c的源程序为: extern int i,j; f1( ) j= i*i+1; 对file1.c中定义的外部变量进行说明无法使用file1.c中的变量i,j8.3全局变量的作用域和生存期程序说明:static限制了全局变量的使用范围。全局静态变量是在编译时,在包含它的源文件所在的程序代码区中为其分配空间,该空间在整个程序执行过程中都归该变量所有,直到程序执行结束时才释放。8.3全局变量的作用域和生存期【例8.10】全局变量的应用样例。8.3全局变量的作用域和生存期#include int i;stati

17、c int j;main( ) void add( ); i=1;j=2;printf(ni=%d j=%d,i,j);add( );printf(ni=%d j=%d,i,j);void add( ) i=i+j; 程序的运行结果如下:i=1 j=2i=3 j=2 8.3全局变量的作用域和生存期程序说明:程序中定义了两个全局变量i和j,其中j是静态全局变量,两个函数中均可使用,其值一直保持到程序执行结束。8.3全局变量的作用域和生存期 注意:静态全局变量可在定义时初始化,没有显式初始化的静态全局变量由编译程序自动初始化为0。如果全局变量是在源文件中各个函数之前定义 , 则该源文件中的各个函数都可以使用它,不需另加说明。如果全局变量是在一个源文件中间定义, 则在其定义之前的函数中使用它时, 应该用 extern 进行说明,说明可以在函数之外,也可以在函数之内进行。8.4函数的存储类别 注意:对于函数来说,由于函数的定义总是在其他函数之外,所以,从本质上讲函数的存储类型都是外部的。但根据需要又可把函数分为外部静态和一般外部两类。外部静态函数也称静态或内部函数。函数定义首部的完整格式为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论