您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第4章 变量的存储类型(2015)
C语言程序设计(2015)第4章变量的存储类型C语言程序设计设计第4章变量的存储类型•变量的内存本质•自动型变量[auto]•寄存器型变量[register]•外部参照型变量[extern]•静态型变量[static]C语言程序设计设计第4章变量的存储类型程序代码区动态存储区外部变量静态变量堆区自动变量函数的形参数据区堆栈区内存空间程序代码区:程序的指令代码静态存储区:静态变量全局变量动态存储区:局部自动变量函数的形参函数调用时的现场保护和返回地址内存空间1.变量的本质C语言程序设计设计第4章变量的存储类型变量定义的一般形式为:存储类型数据类型变量名表;存储类型包括:auto自动型register寄存器型extern外部参照型static静态型变量定义C语言程序设计设计第4章变量的存储类型数据类型变量的数据性质决定了该变量所占内存单元的大小及形式。存储类型变量的存储类型规定了该变量所在的存储区域,规定了该变量作用时间的长短,即寿命的长短,这种性质又称为“存在性”。变量的生存期变量从定义开始到它所占有的存储空间被系统收回为止的时间动态存储变量在程序运行期间,根据需要进行临时性动态分配存储空间的变量。静态存储变量在程序运行期间永久性占用内存的变量。C语言程序设计设计第4章变量的存储类型作用域作用域是该变量在有定义的程序部分。变量在程序中说明的位置决定了该变量的作用域,即在什么范围内可以引用该变量,可引用又称为可见,所以这种性质又称为可见性.变量的可见性的含义在某个程序区域,可以对变量进行访问(或称存取)操作,则称该变量在该区域为可见的,否则为不可见的。局部变量(内部变量)在一个函数内部或复合语句内部定义的变量。全局变量(外部变量)在函数外定义的变量。C语言程序设计设计第4章变量的存储类型自动变量定义一般格式:auto数据类型变量在定义自动型变量时auto可缺省。示例:autointx,y;autofloatz;intx,y;floatz;2.自动变量C语言程序设计设计第4章变量的存储类型自动型变量只能作内部变量,所以自动变量只在定义它的函数或复合语句内有效,即“局部可见”。对于在函数开头声明的自动变量来说,其作用域是声明该变量的函数。不同函数中声明的具有相同名字的各个局部变量之间没有任何关系。作用域及寿命C语言程序设计设计第4章变量的存储类型#includestdio.hvoidfunc();voidmain(){inta=10;func();printf(aofmain()=%d\n,++a);func();func();}输出结果为:aoffunc()=1aofmain()=11aoffunc()=1aoffunc()=1示例:自动变量的特性voidfunc(){autointa=0;printf(aoffunc()=%d\n,++a);}C语言程序设计设计第4章变量的存储类型voidshow(){autointi=3;n++;i++;printf(inputthevalue:n=%di=%d\n“,n,i);{autointi=10;i++;printf(nowthevaluei=%d\n,i);}printf(thenthevaluei=%d\n,i);}#includestdio.hintn;voidshow();voidmain(){autointi;autointn=1;printf(atfirstn=%d\n,n);for(i=1;i3;i++){show();}printf(“atlastn=%d\n,n);}示例:自动变量的初始化和作用域(EX01)程序运行结果:atfirstn=1inputthevalue:n=1i=4nowthevaluei=11thenthevaluei=4inputthevalue:n=2i=4nowthevaluei=11thenthevaluei=4atlastn=1C语言程序设计设计第4章变量的存储类型一般格式:register数据类型变量在函数内或复合语句内定义。示例:registerinti;说明:寄存器型变量存储在CPU的通用寄存器中。因为数据在寄存器中操作比在内存中快得多,可以提高程序的运行速度。通常把程序中使用频率最高的少数几个变量定义为register型。寄存器型变量的定义3.寄存器型变量[register]C语言程序设计设计第4章变量的存储类型分配寄存器的条件有空闲的寄存器;变量所表示的数据的长度不超过寄存器的位长;作用域和寿命同auto类型,也是在定义它的函数或复合语句内有效,即局部可见。C语言程序设计设计第4章变量的存储类型#includestdio.h#defineT10000voiddelay1();voiddelay2();voiddelay1(){registerunsignedi=0;for(;iT;i++){}}voiddelay2(){unsignedi;for(i=1;iT;i++){}}voidmain(){unsignedinti;printf(“\a调用delay1()第一次延时\n);for(i=0;i60000;i++){delay1();}printf(“\a第1次延时结束!\n调用第2次延时!\n);for(i=0;i60000;i++){delay2();}printf(\a第2次延时结束!\n);}示例:用寄存器变量提高程序执行速度(EX02)C语言程序设计设计第4章变量的存储类型定义一般格式:extern数据类型变量说明:extern型变量一般用于在程序的多个编译单位之传送数据,在这种情况下,指定为extern型的变量是在其它编译单位的源程序中定义的。它的存储空间在静态数据区,在程序执行过程中长期占用空间。要访问另一个文件中定义的跨文件作用域的全局变量,必须进行extern说明。作用域及寿命全局存在,全局可见.4.外部参照型变量[extern]C语言程序设计设计第4章变量的存储类型/*file1.c*/eternintx;voidmain(){x++;}示例:/*file2.c*/eternintx;voidfun1(){x+=3;}/*file3.c*/intx=0;voidfun2(){x++;}C语言程序设计设计第4章变量的存储类型#includestdio.hintn=100;externintn;voidhanshu();voidhanshu(void){n-=20;}intn=100;intmain(void){printf(n=%d\n,n);for(;n=60;){hanshu();printf(n=%d\n,n);}return0;}示例:外部变量的特性执行结果:n=100;n=80;n=60;n=40;C语言程序设计设计第4章变量的存储类型\*file1.c*\#includestdio.hinta;intm;intpower();voidmain(){intb=3,c,d;printf(“inputthenumberaand\itspowerm:\n);scanf(%d,%d,&a,&m);c=a*b;printf(%d*%d=%d\n,a,b,c);d=power();printf(%d**%d=%d,a,m,d);}\*file2.c*\externinta;externintm;intpower(){inti,y=1;for(i=1;i=m;i++){y*=a;}return(y);}示例:用extern声明外部变量(EX03)该程序的运行结果为:inputthenumberaanditspowerm:5,45*3=155**4=625C语言程序设计设计第4章变量的存储类型定义一般格式:static数据类型变量在函数或复合语句内部定义的静态变量称为局部静态变量。在函数外定义的静态变量称为全局静态变量。示例:staticfloatx;/*定义x全局静态变量*/voidmain(){staticinty;/*定义y局部静态变量*/……}5.静态型变量[static]C语言程序设计设计第4章变量的存储类型作用域和寿命static类型变量都是全局寿命。全局static变量全局可见。局部static变量局部可见。C语言程序设计设计第4章变量的存储类型说明静态局部变量属于静态存储类型,在静态存储区内分配存储单元。在程序整个运行期间都不释放。自动变量(动态局部变量)属于动态存储类型,占动态存储空间而不占静态存储空间,函数调用结束后即释放。对静态局部变量只赋初值一次,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。对自动变量赋初值,每调用一次函数就重新给一次初值,相当于执行一次赋值语句。C语言程序设计设计第4章变量的存储类型如在定义局部变量时不赋初值:对静态局部变量来说,编译时自动赋值初值0(对数值型变量)或空字符(对字符变量)。对自动变量来说,如果不赋初值,则它的值是一个不确定的值,这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另配置存储单元,而所分配的单元中的值是不确定的。有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。C语言程序设计设计第4章变量的存储类型#includestdio.hinta=2;intf();intf(){autointb=0;staticintc=3;b++;c++;return(a+b+c);}voidmain(){inti;for(i=0;i3;i++){printf(%d\t,f());}}运行结果为:789示例考察静态变量的值(EX04)C语言程序设计设计第4章变量的存储类型/*file1.c*/#includestdio.hstaticfloatx;//x只能在file1.c中使用!floaty;floatf2();floatf1();floatf1(){return(x*x);}voidmain(){x=500;y=100;printf(“f1=%f,f2=%f\n,f1(),f2());}/*file2.c*/externfloaty;//y要extern才能使用!floatf2(){return(y*y);}示例:外部静态变量和外部变量的区别(EX05)输出:F1=250000.000000,f2=10000.000000C语言程序设计设计第4章变量的存储类型#includestdio.hvoidvalue();voidvalue(){intau=0;staticintst=0;printf(au_variable=%d,\st_variable=%d\n,au,st);au++;st++;}voidmain(){inti;for(i=0;i3;i++){value();}}示例局部静态变量与自动变量的区别(EX06)静态变量只执行一次初始化!其值保留在内存中!自动变量每次都执行初始化!其值没有保留在内存中!程序运行结果:au_variable=0,st_variable=0au_variable=0,st_variable=1au_variable=0,st_variable=2C语言程序设计设计第4章变量的存储类型6.存储类型小结关于类型说明关键字auto,static,register用于定义变量的存储类型说明,其中auto通常缺省。关键字extern是用于说明某个变量,已在本函数之外或其它源文件中定义过的外部变量,加extern说明有“延伸外部参照型变量作用域”的作用。C语言程序设计设计第4章变量的存储类型关于变量的作用域和寿命可见性(作用域)局部可见全局可见auto、register局部static型全局static型外部参照型存在性局部寿命全局寿命autoregisterstati
本文标题:第4章 变量的存储类型(2015)
链接地址:https://www.777doc.com/doc-3171992 .html