全国计算机等级考试实用应试教程二级C语言_第12章_C语言中用户标识符的作用域和存储类教材_第1页
全国计算机等级考试实用应试教程二级C语言_第12章_C语言中用户标识符的作用域和存储类教材_第2页
全国计算机等级考试实用应试教程二级C语言_第12章_C语言中用户标识符的作用域和存储类教材_第3页
全国计算机等级考试实用应试教程二级C语言_第12章_C语言中用户标识符的作用域和存储类教材_第4页
全国计算机等级考试实用应试教程二级C语言_第12章_C语言中用户标识符的作用域和存储类教材_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、本章重点12.1 局部变量、全局变量和存储分类12.2 局部变量及其作用域和生存期 12.3 全局变量及其作用域和生存期 12.4 函数的存储分类 第第12章章 C语言中用户标识符的作用域和存储类语言中用户标识符的作用域和存储类112.1 局部变量、全局变量和存储分类12.1.1 用户标识符的作用域标识符的作用域就是指程序中的某一部分,在这一部分中,该标识符是有意义的,可以被C编译和连接程序所识别。例如,变量都有自己的作用域,在一个函数内定义的变量不能在其它函数中引用;变量的作用域与其定义语句在程序中出现的部位有直接关系。据此可以划分出局部变量和全局变量。212.1.2 局部变量、全局变量和存

2、储分类1局部变量在一个函数内(或复合语句中)定义的变量称为内部变量,这些变量只能在定义它的函数(或复合语句)中使用,离开了定义它的函数(或复合语句)就不能使用,把这些变量称“局部变量”。例如:float func1(int a) int b; /*本函数中变量a,b有效*/3几点说明:(1)主函数中定义的变量m和n是局部变量,只能在主函数中有效,在其它函数中无效。(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。如func1函数中定义的b和func2函数中的b,它们占有不同的存储单元,是不同的变量。(3)形式参数也是局部变量。形式参数也只能在本函数中有效,其它函数不能调用。

3、如形式参数a只能在func1函数中有效,形式参数x,y只能在func2函数中有效。4(4)在函数内部的复合语句中定义的变量,只在该复合语句中有效,出了复合语句就无效。在函数开始定义的变量也可以与复合语句中的变量相同,但它们代表的不是同一个变量,它们占用不同的存储单元。52全局变量在函数之外定义的变量称为外部变量,外部变量是全局变量,全局变量可以为本源程序中的所有其它函数所公有。它的有效范围是从定义变量的位置开始到本源文件结束。例如:int m,n;/* 定义两个外部变量m和n,其作用范围全局的即从此处到程序结束*/void f1(a,b)int a,b; 6几点说明:(1)全局变量必须定义在函

4、数之外,如变量a、c、m和n。(2)全局变量的有效范围是从定义的位置开始到整个程序的结束。如a和c的有效范围是整个程序,而m和n的有效范围仅是f1函数(3)在一个函数中可以使用局部变量和相应的全局变量。(4)局部变量可以和全局变量同名,若同名,在函数中使用的变量是局部变量。73存储分类变量具有数据类型,C语言的编译系统根据变量的数据类型给变量分配存储空间,用来存放该变量的值,也就是说变量的数据类型决定了变量占多少个存储单元。变量的存储类型有四个,分别是自动型、寄存器型、静态型和外部参照型,其说明符分别是auto、register、static和extern。 812.2 局部变量及其作用域和生

5、存期12.2.1 auto变量当在函数内部或复合语句内定义变量时,如果没有指定存储类或使用了auto说明符,系统就认为所定义的变量具有自动类别。例如:float a; 等价于 auto float a;912.2.2 register变量寄存器变量也是自动类变量。它与auto变量的区别在于,寄存器型变量是分配在CPU的通用寄存器中的,而不是像一般变量那样,占内存单元。 12.2.3 静态存储类的局部变量当在函数体(或复合语句)内部,用static来说明一个变量,可以称为静态局部变量,其作用域仍与auto、register类型的变量一样。 1012.3 全局变量及其作用域和生存期12.3.1 全

6、局变量的作用域和生存期全局变量只有静态类别。对于全局变量可以使用extern和static两种说明符。全局变量是再函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束为止。 1112.3.2 在同一编译单位内用extern说明符来扩展全局变量的作用域当全局变量定义在引用函数之后时,应该在函数中用extern对此全部变量进行说明,以通知编译程序不需再给它开辟存储单元。这时其作用域从extern说明处起,延伸到该函数的末尾。全局变量的说明与其定义不同,定义只能出现一次,在定义全局变量时,不可使用extern说明符,而对全局变量的说明,可以多次出现在需要的地方,而且必须用

7、extern说明。1212.3.3 在不同编译单位内用extern说明符来扩展全局变量的作用域C语言中,每个可进行单独编译的源文件称为“编译单位”,当一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量,这时若在每个文件中都定义了一个所需的同名全局变量,则在“连接”时将会产生“重复定义”的错误。解决办法通常是,在其中一个文件中定义所有变量,而在其它用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其它编译单位中定义,通知编译程序不必再为它们开辟存储单元。1312.3.4 静态全局变量当用static说明符说明全局变量时,此变量称为静态全局变量。静态全局变

8、量只限于本编译单位使用,不能被其他编译单位所引用。1412.4 函数的存储分类12.4.1 用extern说明函数外部函数是指可以被其它文件中的函数调用的函数,在定义函数的时候如果在“类型说明符”前加上 “extern”,则此函数就为外部函数。其定义格式如下:extern 类型说明符 函数名(形参说明列表)如果在定义函数时省略extern,则隐含为外部函数。 1512.4.2 用static说明函数如果一个函数只能被本文件中其它函数调用,而不能被其它源文件中的函数调用,称它为内部函数,有时也称静态函数。在定义内部函数时,在数据类型符前需加上static(有时也说函数的存储类型为static)。

9、其定义格式如下: static 类型说明符 函数名(形参说明列表)使用静态函数可以避免不同编译单位因函数同名而引起混乱。若强行调用静态函数,将会产生出错信息。16举例举例 例7.15 若外部变量与局部变量同名,分析结果。17#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a为为局局部部变量变量,仅,仅在此函数内有效在此函数内有效b为全部为全部变量

10、变量18#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a、b为为局局部部变量变量,仅,仅在此函数内有效在此函数内有效19 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int

11、 a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);调用三次调用三次每调用一次,开辟每调用一次,开辟新新a和和b,但,但c不是不是20 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次调用开始第一次调用开始21 例12.2 考察静

12、态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次调用期间第一次调用期间1422 例12.2考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) a

13、uto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第一次调用结束第一次调用结束14723 例12.2考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次调用开始第二次调用开始0424 例12.2 考察静态局部变量的值。#include int main(

14、) int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次调用期间第二次调用期间04 5125 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3;

15、 b=b+1; c=c+1; return(a+b+c);bc第二次调用结束第二次调用结束15826 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次调用开始第三次调用开始0527 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i

16、; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次调用期间第三次调用期间05 6128 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a

17、+b+c);bc第三次调用结束第三次调用结束16929 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);c整个程序结束整个程序结束630 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%d

18、n”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);在编译时赋初值在编译时赋初值在函数调用时赋初值在函数调用时赋初值31 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);若不赋若不赋初值初值

19、,是,是0若不若不赋初值赋初值,不确定,不确定32 例12.2 考察静态局部变量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);仅在本函数内有效仅在本函数内有效33 对一个数据的定义,需要指定两种属性: 数据类型和存储类别,分别使用两个关键字例如: static int a; auto char c; register int d; 可以用extern声明已定义的外部变量例如: extern b;静态局部整型变量或静态局部整型变量或静态外部整型变量静态外部整型变量自动变量,在自动变量,在函数内定义函数内定义寄存器变量,寄存器变量,在函数内定义在函数内定义将已定义的外部变量将已定义的外部变量b的作用域扩展至此的作用域扩展至此34(1)从作用域角度分,有局部变量和全从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:局变量

温馨提示

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

评论

0/150

提交评论