资源描述:
《第12章 用户标识符的作用域和存储类.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第12章用户标识符的作用域和存储类12.1局部变量、全局变量和存储类别1.变量作用域变量使用的有效范围。根据变量的有效范围,可划分为局部变量和全局变量。2.局部变量、全局变量和存储分类局部变量:在一个函数体内或复合语句内定义的变量。(又称内部变量)前面程序中遇到的所有变量都是局部变量。全局变量:在函数体之外定义的变量。(又称外部变量)存储分类:有两种存储类别:自动类、静态类。局部变量可以说明为自动类或静态类。全局变量只能说明为静态类。与存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部)。这些说明符通常放在类型名的左边(也可放
2、在类型名的右边)。例:autointa,b;(或intautoa,b;)存储类别确定了所说明对象在内存中的存储位置(存放在哪个区),及对象的作用域和生存期。一个C程序在内存中的存储分配如下:动态存储区静态存储区程序代码区动态存储区保存函数调用时的返回地址、自动类别的局部变量等。静态存储区保存全局变量和静态类别的局部变量。12.2局部变量及作用域和生存期1.auto变量定义局部变量(在一个函数体内或复合语句内定义的变量)时,未指定存储类,或使用了auto说明符,都具有自动类别。例如:inta,b;与autointa,b;等价。局部变量的作用域,从定义的位置起到函数体或复合语句结束为止。
3、例:自动类局部变量的作用域和生存期。voidmyn(intk){inta,b;…..{intx,y;……}…..}X、y作用域a、b作用域局部变量特点:①只允许在定义的范围内使用。②形式参数也是局部变量。③自动类局部变量的存储单元是进入函数体或复合语句时生成,退出时被自动释放(生存期结束)。2.register变量(寄存器变量)也是自动类变量。register变量值放在cpu的寄存器中(不同于auto变量占用内存单元),目的为提高程序运行速度。说明形式:registerinti;registerchara;使用说明:1)寄存变量仅能为局部变量或函数的形参。2)寄存器变量不能用&取地址
4、。3)有的系统规定仅能是int或char作寄存器变量。4)常常将少量频繁使用的量放在寄存器内。例:用函数power计算xn。#includeintpower(int,registerint);main(){ints;s=power(5,3);printf(“%d”,s);}intpower(intx,registerintn){registerintp;for(p=1;n;n--)p=p*x;returnp;}3.静态存储类的局部变量在程序运行期间,静态变量分配固定的存貯单元。程序运行中这些单元始终存在。静态变量说明形式:static类型名变量名;例如:stat
5、icinta;使用说明:1)若在一个函数中定义了静态局部变量,当在程序中第2次调用该函数时,静态局部变量仍保留上次调用该函数的值。2)对未赋初值的静态局部变量,c编译程序自动赋0值。例:静态局部变量的举例#includevoidf(intx){staticintb=100;b+=100;x+=100;printf(“%d%d”,b,x);}voidmain(){intx=100;f(x);f(x);}第一次调用函数f输出:200200第一次调用函数f输出:30020012.3全局变量及其作用域和生存期1.全局变量在函数体之外定义的变量。它只有静态一种类别。全局变
6、量可使用extern和static说明符。全局变量特点:①全局变量可以为源程序中的所有函数使用,作用域从定义的位置开始到本源文件结束。例:#includeintx,y;/*x、y为全局变量*/voidftr(){inta1=40,a2=20;/*a1、a2为局部变量*/x=a1-a2;y=a1+a2;return;}voidmain(){inta=5,b=10;/*a、b为局部变量*/x=a+b;y=a-b;ftr();printf(“x=%dy=%d”,x,y);}输出结果:x=20y=60②若全局变量与某个函数中局部变量同名,在这个函数中,全局变量被屏蔽(不
7、起作用),访问的是局部变量(起作用)。例:#includeintsum;/*sum为全局变量*/voidfun(void);main(){sum=10;printf(“**main(1)**:%d”,sum);fun();printf(“**main(2)**:%d”,sum);voidfun(void){intsum;/*sum为局部变量,与全局变量同名.*/sum=20;printf(“**fun**:%d”,sum);}