(39)--6.6 变量的生存期C语言程序设计基础.ppt
6.6 变量的生存期量的生存期6.6.1变量的作用域与生存期量的作用域与生存期变量的生存期变量的作用域与生存期C语言变量的作用域变量的作用域 是指变量的有效范围,即在程序中哪些语句可以用它。分为局部变量和全局变量。变量的生存期变量的生存期 是指变量被系统分配单元到被回收的时间。在生存期内,变量可能处于作用域中,也可能不在作用域中。变量的生存期变量的作用域与生存期C语言案例案例1 1:编写编写一一个函数,个函数,求两个整数的最大公约数求两个整数的最大公约数和和最小公倍数,最小公倍数,在主函数中在主函数中分别输出最大公约数和最小公倍数分别输出最大公约数和最小公倍数。(将表示最大公约数(将表示最大公约数和最小公倍数和最小公倍数的变量定义为全局变量)的变量定义为全局变量)变量的生存期变量的作用域与生存期C语言变量的生存期变量的作用域与生存期C语言局部变量局部变量在函数内定义的变量(包括形参)在函数内定义的变量(包括形参)作用范围:作用范围:本函数内部本函数内部示例:示例:float f1(int a)int b,c;a,b,c只在只在f1中有效中有效 float f2()char c;c只在只在f2中有效中有效 main()int i,j;i,j只在只在main中有效中有效局部变量局部变量定义在复合语句内的变量定义在复合语句内的变量作用范围:作用范围:复合语句内部复合语句内部 示例:示例:int main()int a,b;int c;c=a+b;;变量变量c的的范围范围变量变量a,b的范围的范围变量的生存期变量的作用域与生存期C语言全局变量全局变量在函数以外定义的变量,不从属于任一函数。在函数以外定义的变量,不从属于任一函数。作用范围:作用范围:从定义处到源文件结束从定义处到源文件结束(包括各函数)(包括各函数)示例:示例:int p,q;float f1(int a)int b,c;char c1,c2;main 全局变量全局变量p,q的作用的作用范围范围全局变量全局变量c1,c2的作的作用范围用范围变量的生存期变量的作用域与生存期C语言案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);变量的生存期变量的作用域与生存期C语言main函数体内局部变量1a2b3c全局变量236变量的生存期变量的作用域与生存期C语言复合语句体内局部变量4b c12案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);amain函数体内局部变量23b6c全局变量14变量的生存期变量的作用域与生存期C语言输出结果:first:14,4,12main函数体内局部变量14a3b复合语句体内局部变量4b12c6c全局变量案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);变量的生存期变量的作用域与生存期C语言输出结果:second:26,4,12main函数体内局部变量14a3b复合语句体内局部变量4b12c6c全局变量26案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);变量的生存期变量的作用域与生存期C语言复合语句体内定义的局部变量b,c的存储空间被系统回收,生存期结束main函数体内局部变量26a3b复合语句体内局部变量4b12c6c全局变量案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);变量的生存期变量的作用域与生存期C语言输出结果:third:26,3,6main函数体内定义的局部变量a,b,c的存储空间被系统回收,生存期结束main函数体内局部变量26a3b6c全局变量案例案例2:#include int c=3;void main()int a=1,b=2;+a;c+=+b;int b=4,c;c=b*3;a+=c;printf(“first:%d,%d,%dn”,a,b,c);a+=c;printf(“second:%d,%d,%dn”,a,b,c);printf(“third:%d,%d,%dn”,a,b,c);6.6 变量的生存期量的生存期6.6.2变量的存量的存储类型与生存期型与生存期变量的生存期变量的存储类型和生存期C语言变量的变量的存储类型存储类型 变量的存储类型是指数据在内存中存储的方式,从变量的生存期角度可分为,静态存储方式和动态存储方式。变量的生存期变量的存储类型和生存期C语言静态局部变量静态局部变量 格式:格式:类型名类型名 变量名变量名 static int a,b;static int a,b;作用范围:局部变量作用范围:局部变量 生存期:与全局变量类似,生存期:与全局变量类似,函数调用时,定义变量,分函数调用时,定义变量,分配存储单元;程序结束,系统自动回收存储单元。配存储单元;程序结束,系统自动回收存储单元。staticstatic变量的生存期变量的存储类型和生存期C语言动态局部变量动态局部变量 格式:格式:autoauto 类型名类型名 变量名变量名 auto int a,b;auto int a,b;或或 int a,b;int a,b;作用范围:局部变量作用范围:局部变量 生存期:生存期:函数调用时,定义变量,分配存储单元;函数调用函数调用时,定义变量,分配存储单元;函数调用结束,系统自动回收存储单元。结束,系统自动回收存储单元。案例案例3:voidmain()incx();incy();incx();incy();incx();incy();voidincx()intx=0;/*等价于等价于autointx=0;*/printf(“x=%dt”,+x);voidincy()staticinty=0;printf(“ny=%dn”,+y);0 xincx函数体内动态局部变量1x输出出结果:果:x=1x生存期生存期结束束0yincy函数体内静态局部变量1y输出出结果:果:x=1Y=1案例案例3:voidmain()incx();incy();incx();incy();incx();incy();voidincx()intx=0;/*等价于等价于autointx=0;*/printf(“x=%dt”,+x);voidincy()staticinty=0;printf(“ny=%dn”,+y);0 xincx函数体内动态局部变量1x输出出结果:果:x=1x生存期生存期结束束incy函数体内静态局部变量2y输出出结果:果:x=1y=1x=1y=2案例案例3:voidmain()incx();incy();incx();incy();incx();incy();voidincx()intx=0;/*等价于等价于autointx=0;*/printf(“x=%dt”,+x);voidincy()staticinty=0;printf(“ny=%dn”,+y);0 xincx函数体内动态局部变量1x输出出结果:果:x=1x生存期生存期结束束incy函数体内静态局部变量3y输出出结果:果:x=1y=1x=1y=2x=1y=3变量的生存期变量的存储类型和生存期C语言静态局部变量在程序整个运行期间都不释放。而动态局部变量函数调用结束后即释放,全局变量在整个程序运行期间都不释放。对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值(对数值型变量)或空字符(对字符变量)。而动态局部变量,如果不赋初值则它的值是一个不确定的值。全局变量默认初值为0(对数值型变量)或空字符(对字符变量)。虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。全局变量可以被其他函数引用。1.局部变量和全局变量局部变量只在定义的函数体内有效全局变量从定义位置开始到程序结束均有效局部变量和全局变量同名时,以局部变量为优先2.静态局部变量和动态局部变量静静态局部局部变量作用范量作用范围是定是定义的函数体内,但生存期是到程序的函数体内,但生存期是到程序结束束动态局部局部变量作用范量作用范围是定是定义的函数体内,但生存期是函数的函数体内,但生存期是函数执行行结束束