第十四讲 局部变量.doc_第1页
第十四讲 局部变量.doc_第2页
第十四讲 局部变量.doc_第3页
第十四讲 局部变量.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

第十四讲 局部变量、全局变量、存储类别、内部函数和外部函数1、局部变量及其作用域凡是在函数内部定义的变量都是局部变量(也称作内部变量),包括在函数内部复合语句中定义的变量和函数形参表中说明的形式参数。局部变量只能在函数内部使用,其作用域是从定义位置起至函数体或复合语句体结束为止。【例】 局部变量的作用域。int fun(int x,int y) int z; z=x+y; return z; main( ) int a=2,b=3; int c; c=a+b; printf(c=%dn,c); printf(a+b=%dn,fun (a,b); 说明(1)在函数fun中定义的变量z和形参x、y都只在函数fun中有效,在主函数中不能引用。(2)在主函数开始定义的局部变量a和b的作用域是整个main函数,在其他函数中不能引用。(3)在main函数的复合语句中定义的局部变量c的作用域仅限于此复合语句,在复合语句外面不能使用。(4)不同作用域中的局部变量可以同名,它们占据着不同的内存单元,不会发生混淆。当作用域产生重叠时,处于“内部”的变量起作用。例如:main( ) int a=2,b=3,c=0; int c; c=a+b; printf(复合语句内c=%dn,c); printf(复合语句外c=%dn,c); 程序运行时输出:复合语句内c=5复合语句外c=0从以上例子中可以看出:当主函数中的局部变量c与函数内部复合语句中的局部变量c同名时,在复合语句内部是自身的局部变量起作用,main函数中的局部变量c被屏蔽。2、全局变量及其作用域凡是在函数外部任何位置上的变量都属于全局变量(也称作外部变量)。全局变量的作用域分以下两种情况。l 全局变量与局部变量不同名时,其作用域是从定义位置开始到它所在的源文件结束为止【例】全局变量作用域示意。int x=1; void fun(int n) int y=2; main( ) int z=3; 说明(1)变量x、y、z都是在函数体外进行的定义,所以都属于全局变量。(2)全局变量x定义在了源程序的开始,它的作用域覆盖了整个源程序。(3)全局变量y定义在了函数fun之后、main函数之前,所以它的作用域不包括函数fun。(4)全局变量z定义在了源程序的末尾,使得它既不能在函数fun中使用,也不能在main函数中使用。由此可见:同是全局变量,由于定义语句的位置不同,作用域的范围也有很大区别。不要误以为全局变量的作用域范围一定比局部变量的作用域范围大。l 全局变量与局部变量同名时,全局变量的作用域不包括同名局部变量的作用域【例】:int a=1; /* 定义全局变量a */main( ) int a=2; /* 定义局部变量a */ fun( ); printf(在main函数中a=%dn,a);fun( ) printf(在fun函数中a=%dn,a); 程序运行时输出:在fun函数中a=1在main函数中a=2说明(1)在源程序的开头定义了全局变量a,并赋有初值1。它的作用域原本应该包括整个源程序。(2)在main函数中定义了局部变量a,并赋有初值2。它的作用域是整个main函数。(3)由于全局变量a与局部变量a出现了重名,因此,在main函数中是局部变量a起作用,全局变量a将被屏蔽而不起作用。(4)在实际应用中应避免同名现象的出现,以增强程序的可读性。使用全局变量,可以不经过参数传递,直接在函数之间共享数据。但由此带来的弊端也是很明显的:程序中任何一个函数对变量的修改,都会影响到其他函数对该变量的引用,容易造成隐蔽的错误。因此,除非十分必要,一般情况下不要使用全局变量。3、变量的存储类别变量的属性:数据类型:决定为变量分配内存单元的长度,数据的存放形式,数的范围。存储类别:决定了变量的生存期,给它分配在哪个存储区。变量定义语句的一般形式存储类别 数据类型 变量名1, , 变量名n ;auto(自动的) register(寄存器的) static(静态的) extern(外部的)31自动变量 内存分配调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。 变量的初值定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。 生存期 在函数或分程序执行期间。 作用域自动变量所在的函数内或分程序内。32静态变量(static类别)除形参外,局部变量和全局变量都可以定义为静态变量。 内存分配编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。 静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值 。 生存期整个程序的执行期间。 作用域局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。33外部变量(extern类别)在函数外定义的变量若没有用 static说明,则是外部变量。外部变量只能隐式定义为extern类别,不能显式定义。 内存分配编译时,将其分配在静态存储区,程序运行结束释放该单元。 变量的初值若定义变量时未赋初值,在编译时,系统自动赋初值为0。 生存期整个程序的执行期间。 作用域从定义处开始到本源文件结束。此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。外部变量声明的一般格式 extern 数据类型 变量名1,变量名n;或 extern 变量名1,变量名n;注意:外部变量声明用关键字extern,而外部变量的定义不能用extern,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。34寄存器变量(register类别)只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存器中。受寄存器长度的限制,寄存器变量只能是char、int和指针类型的变量。【例】寄存器变量的使用。main( ) long int sum=0; register int i; for (i=1; i=1000; i+) sum+=i; printf(sum=%ldn ,sum);35归纳变量的分类1按照变量的作用域对变量分类 局部变量 全局变量2按照变量的生存期对变量分类 静态存储变量包括:局部静态变量和全局静态变量 动态存储变量包括:自动

温馨提示

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

评论

0/150

提交评论