第12章 存储类型与类型界限符

上传人:gui****hi 文档编号:201071566 上传时间:2023-04-18 格式:PPT 页数:29 大小:151KB
收藏 版权申诉 举报 下载
第12章 存储类型与类型界限符_第1页
第1页 / 共29页
第12章 存储类型与类型界限符_第2页
第2页 / 共29页
第12章 存储类型与类型界限符_第3页
第3页 / 共29页
资源描述:

《第12章 存储类型与类型界限符》由会员分享,可在线阅读,更多相关《第12章 存储类型与类型界限符(29页珍藏版)》请在装配图网上搜索。

1、c c语语言言程程序序设设计计c c语语言言程程序序设设计计第第1212章章 存储类型与类型限定符存储类型与类型限定符 c c语语言言程程序序设设计计c c语语言言程程序序设设计计学习目标学习目标(1)理解存储类型的基本概念及类别。)理解存储类型的基本概念及类别。(2)掌握)掌握extern、register、static和和const等类型限定符的使用方法。等类型限定符的使用方法。c c语语言言程程序序设设计计c c语语言言程程序序设设计计在在在在C C语语语语言言言言中中中中,每每每每一一一一个个个个变变变变量量量量和和和和函函函函数数数数都都都都有有有有两两两两个个个个属属属属性性性性:

2、类类类类型型型型(typetype)和和和和存存存存储储储储类类类类型型型型(storagestorageclassclass),其其其其中中中中类类类类型型型型决决决决定定定定了了了了为为为为变变变变量量量量和和和和函函函函数数数数分分分分配配配配多多多多大大大大的的的的存存存存储储储储单单单单元元元元,而而而而存存存存储储储储类类类类型型型型确确确确定定定定了了了了所所所所声声声声明明明明对对对对象象象象的的的的生生生生存存存存期期期期。生生生生存存存存期期期期也也也也称称称称为为为为存存存存储储储储期期期期间间间间,它它它它是是是是指指指指对对对对象象象象保保保保持持持持所所所所分分分分

3、配配配配的的的的存存存存储储储储单单单单元元元元的的的的时时时时间间间间。存存存存储储储储类类类类型型型型有有有有4 4种种种种,分分分分别别别别是是是是自自自自动动动动、外外外外部部部部、寄寄寄寄存存存存器器器器和和和和静静静静态态态态,对应的关键字分别是:对应的关键字分别是:对应的关键字分别是:对应的关键字分别是:autoexternregisterstaticautoexternregisterstaticc c语语言言程程序序设设计计c c语语言言程程序序设设计计前前面面所所涉涉及及到到变变量量,声声明明时时都都没没有有明明显显地地指指明明存存储储类类型型,这这种种缺缺省省的的存存储储

4、类类型型是是自自动动的的。如下列明显地指定存储类型的声明如下列明显地指定存储类型的声明autointa,b;autofloatx,y;c c语语言言程程序序设设计计c c语语言言程程序序设设计计 intinta=12,b=23;a=12,b=23;floatx=5.6,y=16.4;floatx=5.6,y=16.4;进进进进入入入入块块块块时时时时,为为为为变变变变量量量量a a、b b、x x和和和和y y分配存储单元分配存储单元分配存储单元分配存储单元a a1212b b2323x x5.65.6y y16.416.4退退退退出出出出块块块块时时时时,释释释释放放放放分分分分配配配配给给

5、给给变变变变量量量量a a、b b、x x和和和和y y的的的的存存存存储储储储单元单元单元单元a ab bx xy y等价于下列缺省存储类型的声明等价于下列缺省存储类型的声明intint a,b;a,b;float x,y;float x,y;c c语语言言程程序序设设计计c c语语言言程程序序设设计计12.2存储类型存储类型extern 这种变量只要在函数和块之外声明后,这种变量只要在函数和块之外声明后,它能在函数或块的内外都保持分配给它的存它能在函数或块的内外都保持分配给它的存储单元,从而保持其值。储单元,从而保持其值。c c语语言言程程序序设设计计c c语语言言程程序序设设计计#inc

6、ludefloatpi=3.14159;inta=1,b=2,c=3;intf(void);intmain(void)printf(%3dn,f();printf(%3d%3d%3dn,a,b,c);return0;intf(void)intb,c;a=b=c=4;return(a+b+c);外部变量定义时不外部变量定义时不需要使用需要使用externc c语语言言程程序序设设计计c c语语言言程程序序设设计计在在定定义义声声明明外外部部变变量量时时,无无需需使使用用存存储储类类型型符符extern,且且一一般般包包括括有有初初始始化化。但但是是并并不不是是意意味味着着任任何何时时候候都都可可

7、以以省省略略存存储储类类型型符符extern。在在定定义义这这种种外外部部变变量量的的文文件件之之外外的的其其他他文文件件中中使使用用它它时时,需需要要用用存存储储类类型型符符extern声明。声明。外部变量外部变量也称为是也称为是全局变量全局变量。作用域是从定义的地方开始到程序结束。作用域是从定义的地方开始到程序结束。注意:注意:c c语语言言程程序序设设计计c c语语言言程程序序设设计计float area_circle(float r,float*S)extern float pi;if(r0)*S=r*r*pi;return 1;else return 0;例,在另一个文件中函数例,在

8、另一个文件中函数例,在另一个文件中函数例,在另一个文件中函数area_circlearea_circle()()需要访问前述需要访问前述需要访问前述需要访问前述文件中定义的外部变量文件中定义的外部变量文件中定义的外部变量文件中定义的外部变量pipi,则访问前需要用存储类型,则访问前需要用存储类型,则访问前需要用存储类型,则访问前需要用存储类型符符符符extern声明声明声明声明pipi。c c语语言言程程序序设设计计c c语语言言程程序序设设计计所所有有的的函函数数的的存存储储类类型型都都具具有有外外部部存存储储类类型型,在在函函数数体体中中和和函函数数原原型型中中都都可可以以使使用用关关键键

9、字字extern。例如,例如,externfloatarea_circle(float,float*);externfloatarea_circle(floatr,float*S)externfloatpi;if(r0)*S=r*r*pi;return1;elsereturn0;c c语语言言程程序序设设计计c c语语言言程程序序设设计计12.3存储类型存储类型register变量与存储单元关联变量与存储单元关联变量与存储单元关联变量与存储单元关联,一个变量具有一个特定一个变量具有一个特定一个变量具有一个特定一个变量具有一个特定大小的存储单元大小的存储单元大小的存储单元大小的存储单元,给变量赋

10、值就是将该值存储到给变量赋值就是将该值存储到给变量赋值就是将该值存储到给变量赋值就是将该值存储到相应的存储单元中相应的存储单元中相应的存储单元中相应的存储单元中,给变量分配存储单元是由编给变量分配存储单元是由编给变量分配存储单元是由编给变量分配存储单元是由编译程序来完成的译程序来完成的译程序来完成的译程序来完成的,分配给变量的存储单元一般是分配给变量的存储单元一般是分配给变量的存储单元一般是分配给变量的存储单元一般是来自内存。来自内存。来自内存。来自内存。但但但但是是是是,我我我我们们们们可可可可以以以以通通通通过过过过将将将将intint变变变变量量量量声声声声明明明明为为为为存存存存储储储

11、储类类类类型型型型register,register,而而而而把把把把寄寄寄寄存存存存器器器器(CPU(CPU中中中中的的的的存存存存储储储储单单单单元元元元)分分分分配配配配给给给给它它它它,这样有关该变量的运算速度将得到提高。这样有关该变量的运算速度将得到提高。这样有关该变量的运算速度将得到提高。这样有关该变量的运算速度将得到提高。c c语语言言程程序序设设计计c c语语言言程程序序设设计计例:例:register int i;for(i=0;i MAX;+i)注意注意:寄存器变量寄存器变量i尽可能在接近使用它尽可能在接近使用它的位置处进行声明。的位置处进行声明。c c语语言言程程序序设设

12、计计c c语语言言程程序序设设计计外部变量外部变量(extern)是全局变量是全局变量,它可以在其它可以在其他程序文件中使用。本节将介绍的静态他程序文件中使用。本节将介绍的静态(static)变量只能在本程序文件中可以用。变量只能在本程序文件中可以用。存储类型符存储类型符static有两种用法有两种用法,一种用于声明变量一种用于声明变量,另一种另一种用于声明函数。用于声明函数。12.4 存储类型存储类型staticc c语语言言程程序序设设计计c c语语言言程程序序设设计计变量可有两种变量可有两种,一种是局部的一种是局部的,即在块内定义的变量即在块内定义的变量;另一种是外部的另一种是外部的,即

13、在块外和函数外定义的变量。即在块外和函数外定义的变量。(1 1)首先介绍声明局部变量为)首先介绍声明局部变量为static的情形。此种情的情形。此种情 形,允许局部变量保持它的原有值,以便再次形,允许局部变量保持它的原有值,以便再次 进入块内时使用它。进入块内时使用它。1变量声明为存储类型变量声明为存储类型staticc c语语言言程程序序设设计计c c语语言言程程序序设设计计#includevoidf(void);intmain(void)f();f();f();return0;voidf(void)intcnt=0;+cnt;printf(ncnt=%d,cnt);运行结果:运行结果:cn

14、t=0cnt=0cnt=0修改为:修改为:staticintcnt=0;运行结果:运行结果:cnt=1cnt=2cnt=3c c语语言言程程序序设设计计c c语语言言程程序序设设计计 这种情形这种情形,不管程序如何执行不管程序如何执行,变量也保持它的变量也保持它的原有值原有值,但是但是,不允许其他文件对它进行访问不允许其他文件对它进行访问,即一即一个文件中个文件中static类型的外部变量不能被其他文件类型的外部变量不能被其他文件“操作操作”,即它对外而言是不可见的即它对外而言是不可见的,这种变量也称为这种变量也称为私有变量私有变量。(2)声明外部变量为声明外部变量为static的情形。的情形

15、。c c语语言言程程序序设设计计c c语语言言程程序序设设计计程序文件程序文件file1.c:程序文件程序文件file2.c:#includeexternvoidf(void);intmain(void)f();f();f();return0;#includestaticintcnt=0;voidf(void)+cnt;printf(“ncnt=%d”,cnt);c c语语言言程程序序设设计计c c语语言言程程序序设设计计 与静态外部变量类似与静态外部变量类似,静态外部静态外部(static)函数也是所属文件的私有函数,只能在该文函数也是所属文件的私有函数,只能在该文件中被其他函数调用,对其他

16、文件是不可见件中被其他函数调用,对其他文件是不可见的。该功能对开发函数定义的私有模块是很的。该功能对开发函数定义的私有模块是很有用的。有用的。2函数声明为存储类型函数声明为存储类型staticc c语语言言程程序序设设计计c c语语言言程程序序设设计计程序文件程序文件file1.c:程序文件程序文件file2.c:#includeexternintF(void);intmain(void)F();F();F();return0;#includestaticintcnt=0;staticintf(void)+cnt;printf(“ncnt=%d”,cnt);voidF(void)f();c c

17、语语言言程程序序设设计计c c语语言言程程序序设设计计类型限定符类型限定符const用于限制对象的值被修改用于限制对象的值被修改,它告它告诉编译器防止用户修改对象的值。一般情况诉编译器防止用户修改对象的值。一般情况,在声明在声明中中const出现在存储类型符之后类型符之前出现在存储类型符之后类型符之前,考虑声明考虑声明staticconstintk=3;我们把它读作我们把它读作“k是一个静态存是一个静态存储类型的整型常量储类型的整型常量”。由于已经用。由于已经用const限定了限定了k的的类型类型,我们可以对我们可以对k进行初始化进行初始化,但以后不能再对但以后不能再对k赋赋值、增量或减量。值

18、、增量或减量。12.5 类型限定符类型限定符constc c语语言言程程序序设设计计c c语语言言程程序序设设计计 不不不不能能能能把把把把由由由由constconst限限限限定定定定的的的的变变变变量量量量的的的的地地地地址址址址赋赋赋赋值值值值给给给给非非非非限限限限定定定定的的的的指针。下面会引起编译器报警:指针。下面会引起编译器报警:指针。下面会引起编译器报警:指针。下面会引起编译器报警:constconstintinta=8;a=8;intint*ptrptr=&a;=&a;其其其其原原原原因因因因是是是是&a&a是是是是“constconst intint *”*”类类类类型型型型

19、的的的的值值值值,不不不不能能能能将将将将它它它它赋赋赋赋值值值值给给给给“intint*”*”类型的变量类型的变量类型的变量类型的变量ptrptr。另一方面。另一方面。另一方面。另一方面,下列是允许的:下列是允许的:下列是允许的:下列是允许的:constconstintinta=8;a=8;constconstintint*ptrptr=&a;=&a;注注注注意意意意:这这这这里里里里ptrptr本本本本身身身身不不不不是是是是一一一一个个个个常常常常量量量量,所所所所以以以以,修修修修改改改改ptrptr的的的的值值值值是可以的是可以的是可以的是可以的,如下列是合法的:如下列是合法的:如下

20、列是合法的:如下列是合法的:constconstintinta=8,b=9;a=8,b=9;constconstintint*ptrptr=&a;=&a;ptrptr=&b;=&b;c c语语言言程程序序设设计计c c语语言言程程序序设设计计如果要使如果要使ptr本身是常量,而不是它所指的对象,则可本身是常量,而不是它所指的对象,则可以用如下声明来完成:以用如下声明来完成:inta=8;int*constptr=&a;把后一声明读作把后一声明读作“ptr是一个指向是一个指向int的常量指针的常量指针,其初始其初始值是值是a的地址的地址”。此后。此后,不能对不能对ptr赋值赋值,但可以对但可以对

21、*ptr赋赋值。再考虑值。再考虑constinta=8;constint*constptr=&a;后一个声明告诉编译器后一个声明告诉编译器ptr是一个指向常量是一个指向常量int的常量的常量指针。对指针。对ptr和和*ptr都不能赋值、增量或减量。都不能赋值、增量或减量。c c语语言言程程序序设设计计c c语语言言程程序序设设计计#includevoidG(constint);intmain(void)intn=5;G(n);voidG(constintm)m=m+2;const用于函数参数有用于函数参数有4种情形。种情形。1const限制的函数参数是一般变量限制的函数参数是一般变量c c语语

22、言言程程序序设设计计c c语语言言程程序序设设计计 函数函数G()定义中声明的参数定义中声明的参数m被限被限制为常量制为常量(const)但函数体中试图改变它但函数体中试图改变它的值,这是错误的。的值,这是错误的。c c语语言言程程序序设设计计c c语语言言程程序序设设计计2指向常量数据的非常量指针指向常量数据的非常量指针#includevoidG(constint*);intmain(void)ints=1,2,3,4,5;G(s);voidG(constint*p)p=p+1;*p=*p+2;c c语语言言程程序序设设计计c c语语言言程程序序设设计计 函数函数G()定义中声明参数定义中声

23、明参数ptr为指向为指向int常量常量数据的非常量指针,所以函数体中数据的非常量指针,所以函数体中“p=p+1”改变指针本身,这是合法的;而改变指针本身,这是合法的;而“*p=*p+2”试图改变指针所指的值,这是错误的。试图改变指针所指的值,这是错误的。c c语语言言程程序序设设计计c c语语言言程程序序设设计计#includevoidG(int*const);intmain(void)ints=1,2,3,4,5;G(s);voidG(int*constp)p=p+1;*p=*p+2;3指向非常量数据的常量指针指向非常量数据的常量指针c c语语言言程程序序设设计计c c语语言言程程序序设设计计 函数函数G()定义中声明参数定义中声明参数ptr为指向为指向int数据数据的常量指针,所以函数体中的常量指针,所以函数体中“p=p+1”试图改试图改变指针本身,这是错误的;而变指针本身,这是错误的;而“*p=*p+2”是是改变指针所指的值,这是合法的。改变指针所指的值,这是合法的。c c语语言言程程序序设设计计c c语语言言程程序序设设计计#includevoidG(constint*const);intmain(void)ints=1,2,3,4,5;G(s);voidG(constint*constp)p=p+1;*p=*p+2;4指向常量数据的常量指针指向常量数据的常量指针

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

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

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


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