C语言中用户标示符的作用域和存储类.ppt

上传人:tia****nde 文档编号:12805497 上传时间:2020-05-25 格式:PPT 页数:20 大小:2.26MB
返回 下载 相关 举报
C语言中用户标示符的作用域和存储类.ppt_第1页
第1页 / 共20页
C语言中用户标示符的作用域和存储类.ppt_第2页
第2页 / 共20页
C语言中用户标示符的作用域和存储类.ppt_第3页
第3页 / 共20页
点击查看更多>>
资源描述
第12章C语言中用户标识符的作用域和存储类,第12章C语言中用户标识符的作用域和存储类,局部变量全局变量和存储分类用户标识符的作用域局部变量全局变量和存储分类局部变量及其作用域和生存期auto变量、register变量、静态存储类的局部变量全局变量及其作用域和生存期函数的存储分类用extern说明函数用static说明函数,局部变量全局变量和存储分类,局部变量全局变量和存储分类,局部变量及其作用域和生存期,例如,floata;就等价于:autofloata;auto变量的存储单元被分配在内存的动态存储区每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作他用auto变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止,局部变量及其作用域和生存期,例如,voidsub(floata)inti;if(i0)intn;printf(%dn,n);,所有自动局部变量的存储单元都是在进入这些局部变量所在的函数体(或复合语句)时生成,退出其所在的函数体(或复合语句)时消失这就是自动类局部变量的“生存期”当再次进入函数体(或复合语句)时,系统将为它们另行分配存储单元,因此变量的值不可能被保留若通过定义语句给自动变量赋初值,赋初值的操作是在程序运行过程中进行的,每进入一次函数体(或复合语句),就赋一次初值,局部变量及其作用域和生存期,局部变量及其作用域和生存期,#includeintpower(int,registerint);main()ints;s=power(5,3);printf(%dn,s);intpower(intx,registerintn)registerintp;for(p=1;n;n-)p=p*x;returnp;,局部变量及其作用域和生存期,说明,1)CPU中寄存器的数目是有限的,因此只能说明少量的寄存器变量2)由于register变量的值是放在寄存器内而不是放在内存中,所以register变量没有地址,也就不能对它进行求地址运算3)register变量的说明应尽量靠近其使用的地方,用完之后尽快释放,以便提高寄存器的利用效率这可以通过把对register变量的说明和使用放在复合语句中来实现,全局变量及其作用域和生存期,全局变量可使用extern和static两种说明符,全局变量的作用域和生存期,voidfun1(void);voidfun2(void);intsum;/*定义全局变量*/main()sum+;voidfun1(void)sum+;inttest;/*定义全局变量*/voidfun2(void)sum+;test=1;,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,sum是在整个源程序的开始定义的,它的作用域是整个程序test是在函数fun2前定义的,它的作用域从定义处开始直到程序结束。全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道全局变量的生存期是整个程序的运行期间若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系,例如,全局变量的作用域和生存期,#includeintsum;/*定义全局变量*/voidfun(void);main()sum=10;printf(*main(1)*:%dn,sum);fun();printf(*main(2)*:%dn,sum);voidfun(void)intsum;/*定义同名局部变量*/sum=20;printf(*fun*:%dn,sum);,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,*main(1)*:10*fun*:20*main(2)*:10即全局变量sum的作用域是除函数fun以外的整个程序;局部变量sum的作用域仅是函数fun内部,结果,全局变量的作用域和生存期,全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止,除十分必要外,一般不提倡使用全局变量,原因主要有以下三个方面:1)不论是否需要,全局变量在整个程序运行期间都占用内存空间2)全局变量必须在函数以外定义,降低了函数的通用性,影响了函数的独立性3)使用全局变量容易因疏忽或使用不当而导致全局变量中的值意外改变,从而引起副作用,产生难以查找的错误,说明,在同一编译单位内用extern说明符扩展全局变量的作用域,当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元这时其作用域从extern说明处起,延伸到该函数末尾,全局变量的说明与全局变量的定义不同:变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地方,这时必须用extern进行说明,注意,在不同编译单位内用extern说明符扩展全局变量的作用域,每个可进行单独编译的源文件称为“编译单位”当一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量,这时若在每个文件中都定义了一个所需的同名全局变量,则在“连接”时将会产生“重复定义”错误解决的办法通常是:在其中一个文件中定义所有全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必再为它们开辟存储单元,在不同编译单位内用extern说明符扩展全局变量的作用域,/*file1.c文件*/*file2.c文件*/#include#includeintx,y;/*定义全局变量*/externintx;/*说明全局变量*/voidfun1();voidfun2()voidfun2();printf(%dn,x);/*输出结果为111*/voidfun3();main()fun1();voidfun3()fun2();x+;fun3();printf(%dn,x);/*输出结果为112*/voidfun1()x=111;,程序在不同的编译单位内引用了全局变量x,即在文件file2.c中使用了文件file1.c中定义的全局变量由于在file2.c中,说明语句externintx;放在了文件开始,所以变量x的作用域包含了file2.c整个文件若将这一说明改放在函数fun2内,变量x的作用域就只从说明的位置起延伸到函数fun2的末尾也就是说,在函数fun3中将不能引用全局变量x了,静态全局变量,当用static说明符说明全局变量时,此变量可称作“静态”全局变量静态全局变量只限于本编译单位使用,不能被其他编译单位所引用,例12.4读程序,分析程序的错误。,/*file1.c文件*/*file2.c文件*/#include#includestaticintn;externintn;voidfunc();voidfunc()main()printf(file2:%dn,n);n=5;printf(file1:%dn,n);func();,函数的存储分类,所有函数都是外部的,因为不允许在函数内部定义另一个函数但当定义函数时,可以使用extern或static说明符,函数的存储分类,所有函数都是外部的,因为不允许在函数内部定义另一个函数但当定义函数时,可以使用extern或static说明符,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!