资源描述:
《c语言基础第10章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第10章数据的存储类型10.1变量在内存中的存储10.2局部变量和全局变量10.3变量的存储类型10.4内部函数和外部函数10.5动态存储单元10.6修饰符const本章介绍C语言对变量规定的一些存储类型。其中要涉及到变量的生存期,变量的作用域,可见性,局部变量和全局变量等一些重要概念。10.1变量在内存中的存储系统为运行程序,在内存中为数据的存储开辟了两块区域:静态数据区和动态数据区。分配在静态数据区的变量,叫做静态变量,分配在动态数据区的变量叫做动态变量。变量从在数据区建立到被撤销,这段时间称为变量的生存期。分配在静态
2、数据区的变量,在程序运行结束前是一直存在的。这样的变量的生存期为程序的运行期。有些变量是在程序运行期间根据需要动态地分配到动态数据区的,在适当的时候会将这种动态变量的空间收回。所以,动态变量的生存期是有限的。变量在程序的某一部分是有效的,而在另一部分可能是无效的,不可见的。有的变量可能在整个程序文件中一直有效的。对于上述情况,我们说变量有不同的作用域。所谓变量的作用域,就是指变量的使用范围。从作用域这个角度讲,变量区分为局部变量和全局变量。全局变量分配在静态数据区,而局部变量则根据需要可能分配在动态数据区,也可能分配在静态
3、数据区。10.2局部变量和全局变量10.2.1局部变量在任何一个代码块内定义的变量叫做局部变量。所谓代码块就是在一对花括号内的代码段,包括函数体,函数体内的语句块。局部变量只能在说明它的代码块内使用,局部变量的作用域,限于说明它的代码块内:从说明的地方开始至所在的代码块结束。局部变量在执行说明它所在的代码块时,才是存在的。当退出其代码块时,这些变量也就随之消失,成为不可见。例10.2.1下面的程序,在同一个main()函数中,定义了三个数据类型和变量名均相同的局部变量i。在访问这些变量i中,它们不会混淆。因为它们是三个不同
4、的局部变量。它们各有自己的作用域。程序如下:#include"stdio.h"main(){inti=10;/*定义函数main()的局部变量i,它的作用域是整个函数内 */printf("Enterapositiveornegativenumber:");scanf("%d",&i);printf("Inmain()i=%d",i);if(i>0){inti=-10;/*定义在if代码块内的局部变量i有效,主函数定义的i不可见*/printf("Inifiis%d",i);}else{inti=20;/*定义el
5、se代码块的局部变量i有效,前两个i不可见*/printf("Inif_elseiis%d",i);}printf("Theiinmain()stillis%d",i);/*主函数定义的i有效*/return;}局部变量在没有初始化或没有被赋值之前,它的值是不确定的。形参也是局部变量。它的作用域和使用规则,与函数内部的局部变量完全一样。10.2.2全局变量作用域是从定义点开始直到程序文件结束的变量,称为全局变量。整个程序文件设置全局变量的好处就在于,增加了函数间传递数据的渠道。例10.2.2求下面一元二次方程的根:
6、要求在这个程序中,方程的系数a,b,c设置为局部变量,方程的根X1,X2和根的虚部q和实部p都设置为全局变量,b2−4ac的值d也设置位全局变量。三种根(两个不同的实根,两个相等的实根和两个虚根)分别由三个函数计算。程序如下:#include"stdio.h"#include"math.h"floatX1,X2,p,q,d;/*定义全局变量*/voidgreater_than_zero(float,float);/*函数说明*/voidequal_to_zero(float,float);voidsmaller_than_
7、zero(float,float);main(){floata,b,c;/*定义局部变量*/printf("Entera,b,c:");scanf("%f%f%f",&a,&b,&c);d=b*b-4*a*c;if(d>0){greater_than_zero(a,b);printf("X1=%5.2ftX2=%5.2f",X1,X2);}elseif(d==0){equal_to_zero(a,b);printf("X1=X2=%5.2f",X1);}else{smaller_than_zero(a,b);pr
8、intf("X1=%5.2f+%5.2fi",p,q);printf("X2=%5.2f-%5.2fi",p,q);}return0;}voidgreater_than_zero(floatx,floaty){X1=(-y+sqrt(d))/(2*x);X2=(-y-sqrt(d))/(2*x)