1、南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 1 1变量的作用域变量的作用域与变量的存储类别与变量的存储类别 南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 2 28.8 局部变量和全局变量局部变量和全局变量8.8.1 局部变量局部变量n内部变量:内部变量:n在一个函数内部定义的变量称内部变量。它只在本函在一个函数内部定义的变量称内部变量。它只在本函数范围内有效,即:只有在本函数内才能使用这些变数范围内有效,即:只有在本函数内才能使用这些变量,故称为量,故称为“局部变量局部变量”。n float f1
2、(int a)/*函数函数f1 */int b,c;/*a、b、c有效有效 */char f2(int x,int y)/*函数函数f2 */int i,j;/*x、y、i、j有效有效 */void main()/*主函数主函数 */int m,n;/*m、n有效有效 */南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 3 38.8 局部变量和全局变量局部变量和全局变量8.8.1 局部变量局部变量n 内部变量:内部变量:n主函数中定义的变量只在主函数中有效主函数中定义的变量只在主函数中有效,而不因而不因为在主函数中定义而在整个文件或程序中有效。主为
3、在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。函数也不能使用其他函数中定义的变量。n不同函数中可以使用相同名字的变量不同函数中可以使用相同名字的变量,它们代表它们代表不同的对象不同的对象,互不干扰。互不干扰。n形式参数也是局部变量。形式参数也是局部变量。n在一个函数内部在一个函数内部,可以在复合语句中定义变量可以在复合语句中定义变量,这这些变量只在本复合语句中有效些变量只在本复合语句中有效,这种复合语句也称为这种复合语句也称为“分程序分程序”或或“程序块程序块”。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 4 4
4、8.8 局部变量和全局变量局部变量和全局变量8.8.1 局部变量局部变量n 内部变量:内部变量:nvoid main()int a,b;int c;c=a+b;c在此范围内有效在此范围内有效 a,b在此范围内也有效在此范围内也有效 n 复合语句也称为复合语句也称为“分程序分程序”或或“程序块程序块”。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 5 58.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量n 外部变量:外部变量:n函数之外定义的变量称为外部变量。外部变量函数之外定义的变量称为外部变量。外部变量可以为本文件中其他函
5、数所共用。它的有效范可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。围为从定义变量的位置开始到本源文件结束。所以也称全程变量。所以也称全程变量。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 6 68.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量n外部变量:外部变量:n int p=1,q=5;/*外部变量外部变量*/float f1(int a)/*定义函数定义函数f1*/int b,c;char c1,c2;/*外部变量外部变量*/char f2(int x,int y)/*定义函数定义函
6、数f2*/int i,j;全局变量全局变量p,q的作用范围的作用范围 全局变量全局变量c1,c2的作用范围的作用范围 void main()/*主函数主函数*/int m,n;南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 7 78.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量n 例例8.15 有一个一维数组,内放有一个一维数组,内放10个学生成绩,写一个函个学生成绩,写一个函数,求出平均分、最高分和最低分。数,求出平均分、最高分和最低分。n#include float Max=0,Min=0;/*全局变量全局变量*/voi
7、d main()float average(float array,int n);float ave,score10;int i;for(i=0;i10;i+)scanf(“%f”,&scorei);ave=average(score,10);printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,Max,Min,ave);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 8 88.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量nfloat average(float array,int n)/
8、*定义函数,定义函数,形参为数组形参为数组*/int i;float aver,sum=array0;Max=Min=array0;for(i=1;iMax)Max=arrayi;else if(arrayiMin)Min=arrayi;sum=sum+arrayi;aver=sum/n;return(aver);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 9 98.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 10 108.8
9、局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量n建议:建议:一般不使用全局变量,因为:一般不使用全局变量,因为:n全局变量在程序的全部执行过程中都占用存储单全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。元,而不是仅在需要时才开辟单元。n使用全局变量过多,会降低程序的清晰性。在各使用全局变量过多,会降低程序的清晰性。在各个函数执行时都可能改变外部变量的值,程序容易出个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。错。因此,要限制使用全局变量。n降低函数的通用性。因为函数在执行时要依赖于降低函数的通用性。因为函数在执行时要依
10、赖于其所在的外部变量。如果将一个函数移到另一个文件其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。一般要求把程序中降低了程序的可靠性和通用性。一般要求把程序中的函数做成一个封闭体,除了可以通过的函数做成一个封闭体,除了可以通过“实参实参形参形参”的渠道与外界发生联系外,没有其他渠道。的渠道与外界发生联系外,没有其他渠道。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系
11、刘琳岚计算机应用技术系刘琳岚 11 118.8 局部变量和全局变量局部变量和全局变量8.8.2 全局变量全局变量n 例例8.16 外部变量与局部变量同名。外部变量与局部变量同名。n#include int a=3,b=5;/*a,b为外部变量为外部变量*/a,b作用范围作用范围void main()int a=8;/*a为局部变量为局部变量*/局部变量局部变量a作用范围作用范围 printf(“%d”,max(a,b);全局变量全局变量b的作用范围的作用范围max(int a,int b)/*a,b为局部变量为局部变量*/int c;c=ab?a b;形参形参a、b作用范围作用范围 retur
12、n(c);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 12 128.9 变量的存储类别变量的存储类别8.9.1 动态存储方式与静态存储方式动态存储方式与静态存储方式n 从变量的作用域(即从空间)角度来分,可分为:从变量的作用域(即从空间)角度来分,可分为:n全局变量全局变量n局部变量局部变量n 从变量值存在的时间角度来分,可分为:从变量值存在的时间角度来分,可分为:n静态存储方式:指在程序运行期间由系统分配固定的存静态存储方式:指在程序运行期间由系统分配固定的存储空间的方式。储空间的方式。n动态存储方式:则是在程序运行期间根据需要进行动态动态存
13、储方式:则是在程序运行期间根据需要进行动态的分配存储空间的方式。该存储空间可分为:的分配存储空间的方式。该存储空间可分为:n 程序区程序区 n 静态存储区静态存储区 n 动态存储区动态存储区南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 13 138.9 变量的存储类别变量的存储类别8.9.1 动态存储方式与静态存储方式动态存储方式与静态存储方式n 变量和函数有两个属性:变量和函数有两个属性:n数据类型数据类型n数据的存储类别:数据的存储类别:数据在内存中存储的方式。数据在内存中存储的方式。n 存储方式分为两大类:存储方式分为两大类:n静态存储类静
14、态存储类n动态存储类动态存储类n 自动的(自动的(auto)n 静态的(静态的(static)n 寄存器的(寄存器的(register)n 外部的(外部的(extern)n 根据变量的存储类别,可以知道变量的作用域和生根据变量的存储类别,可以知道变量的作用域和生存期。存期。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 14 148.9 变量的存储类别变量的存储类别8.9.2 auto变量变量n 自动变量自动变量auto:n专门声明为专门声明为static存储类别的局部变量都是动态分配存存储类别的局部变量都是动态分配存储空间,在调用该函数时系统会给
15、它们分配存储空间,储空间,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类在函数调用结束时就自动释放这些存储空间。因此这类局部变量局部变量称为自动变量。称为自动变量。n自动变量用关键字自动变量用关键字auto作存储类别的声明。作存储类别的声明。n函数中的形参和在函数中定义的变量函数中的形参和在函数中定义的变量(包括在复合语句包括在复合语句中定义的变量中定义的变量),都属此类。,都属此类。n例如:例如:int f(int a)/*定义定义f函数,函数,a为形参为形参*/auto int b,c=3;/*定义定义b、c为自动变量为自动变量*/南昌航空大学信息
16、工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 15 158.9 变量的存储类别变量的存储类别8.9.3 用用static声明局部变量声明局部变量n 静态变量静态变量static:n当函数中的局部变量的值在函数调用结束后不消失而保当函数中的局部变量的值在函数调用结束后不消失而保留原值时,该变量称为静态局部变量。留原值时,该变量称为静态局部变量。n用关键字用关键字static进行声明。进行声明。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 16 168.9 变量的存储类别变量的存储类别8.9.3 用用static声明局
17、部变量声明局部变量n 例例8.17 考察静态局部变量的值。考察静态局部变量的值。n#include void main()int f(int);int a=2,i;for(i=0;i3;i+)printf(“%d”,f(a);int f(int a)auto int b=0;static c=3;b=b+1;c=c+1;return(a+b+c);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 17 178.9 变量的存储类别变量的存储类别8.9.3 用用static声明局部变量声明局部变量n 对静态局部变量的说明:对静态局部变量的说明:n 静态局
18、部变量属静态存储类别,在静态存储区内分静态局部变量属静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属动态存储类别,占动态存储区量(即动态局部变量)属动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。空间而不占静态存储区空间,函数调用结束后即释放。n 对静态局部变量是在编译时赋初值的,即只赋初值对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时
19、的值。不再重新赋初值而只是保留上次函数调用结束时的值。n 如在定义局部变量时不赋初值的话,则对静态局部如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值(对数值型变量)或空变量来说,编译时自动赋初值(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。值则它的值是一个不确定的值。n 虽然静态局部变量在函数调用结束后仍然存在,但虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。其他函数不能引用它。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应
20、用技术系刘琳岚 18 188.9 变量的存储类别变量的存储类别8.9.3 用用static声明局部变量声明局部变量n 例例8.18 输出输出1到到5的阶乘值。的阶乘值。n#include void main()int fac(int n);int i;for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);int fac(int n)static int f=1;f=f*n;return(f);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 19 198.9 变量的存储类别变量的存储类别8.9.4 register变量变量
21、 n 寄存器变量寄存器变量register:n变量的值是存放在内存中的。当程序中用到哪一个变量变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。算器将数据送到内存存放。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 20208.9 变量的存储类别变量的存储类别8.9.4 register变量变量 n 寄存器变量寄存器变量register的
22、使用:的使用:n如果有一些变量使用频繁,则为存取变量的值要花费不如果有一些变量使用频繁,则为存取变量的值要花费不少时间。少时间。n为提高执行效率,为提高执行效率,C语言允许将局部变量的值放在语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。不必再到内存中去存取。n由于对寄存器的存取速度远高于对内存的存取速度,因由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。此这样做可以提高执行效率。n这种变量叫做寄存器变量,用关键字这种变量叫做寄存器变量,用关键字register作声明
23、。作声明。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 21 218.9 变量的存储类别变量的存储类别8.9.5 用用extern声明外部变量声明外部变量n 外部变量:外部变量:n外部变量是在函数的外部定义的全局变量,它的作用外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。域是从变量的定义处开始,到本程序文件的末尾。n在此作用域内,全局变量可以为程序中各个函数所引在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。用。编译时将外部变量分配在静态存储区。n用用extern来声
24、明外部变量,以扩展外部变量的作用城来声明外部变量,以扩展外部变量的作用城。n 用用extern声明外部变量:声明外部变量:n在一个文件内声明外部变量在一个文件内声明外部变量n在多文件的程序中声明外部变量在多文件的程序中声明外部变量南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 22228.9 变量的存储类别变量的存储类别8.9.5 用用extern声明外部变量声明外部变量n 例例8.20 用用extern声明外部变量,扩展它在程序声明外部变量,扩展它在程序文件中的作用域。文件中的作用域。n#include void main()int max(in
25、t,int);/*外部变量声明外部变量声明*/extern A,B;printf(%dn,max(A,B);int A=13,B=-8;/*定义外部变量定义外部变量*/int max(int x,int y)/*定义定义max函数函数*/int z;z=xy?x:y;return(z);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 23238.9 变量的存储类别变量的存储类别8.9.5 用用extern声明外部变量声明外部变量n 例例8.21 用用extern将外部变量的作用域扩展到其他文件。将外部变量的作用域扩展到其他文件。本程序的作用是给定本
26、程序的作用是给定b的值,输入的值,输入a和和m,求,求ab和和am的的值。文件值。文件file1.c中的内容为:中的内容为:n#include int A;/*定义外部变量定义外部变量*/void main()int power(int);/*函数声明函数声明*/int b=3,c,d,m;printf(“enter the number a and its power m:n”);scanf(“%d,%d”,&A,&m);c=A*b;printf(“%d*%dn”,A,b,c);d=power(m);printf(“%d*%d=%dn”,A,m,d);南昌航空大学信息工程学院南昌航空大学信息
27、工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 24248.9 变量的存储类别变量的存储类别8.9.5 用用extern声明外部变量声明外部变量n 例例8.21 用用extern将外部变量的作用域扩展到其将外部变量的作用域扩展到其他文件。本程序的作用是给定他文件。本程序的作用是给定b的值,输入的值,输入a和和m,求求ab和和am的值。的值。文件文件file1.c中的内容为:中的内容为:#include int A;/*定义外部变量定义外部变量*/void main()int power(int);/*函数声明函数声明*/int b=3,c,d,m;printf(“enter the nu
28、mber a and its power m:n”);scanf(“%d,%d”,&A,&m);c=A*b;printf(“%d*%dn”,A,b,c);d=power(m);printf(“%d*%d=%dn”,A,m,d);文件文件file2.c中的内容为:中的内容为:extern A;/*声明声明A为一个已定义的外部变量为一个已定义的外部变量*/int powre(int n)int i,y=1;for(i=1;i=n;i+)y=y*A;return(y);南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 25258.9 变量的存储类别变量的存
29、储类别8.9.6 用用static声明外部变量声明外部变量n 用用static声明外部变量:声明外部变量:n在程序设计中在程序设计中,某些外部变量只限于被本文件引用,而某些外部变量只限于被本文件引用,而不能被其他文件引用。不能被其他文件引用。n这时可以在定义外部变量时加一个这时可以在定义外部变量时加一个staitic声明。声明。n 例如:例如:nfile1.c file2.cstatic int A;extern int A;void main()void fun(int n)A=A*n;南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 26268.
30、9 变量的存储类别变量的存储类别8.9.7 关于变量的声明和定义关于变量的声明和定义n 定义性声明:定义性声明:n需要建立存储空间的声明,例如:需要建立存储空间的声明,例如:int a;n 引用性声明:引用性声明:n不需建立存储空间的声明,例如:不需建立存储空间的声明,例如:extern a;n 注意:注意:n声明包括定义,但并非所有的声明都是定义。声明包括定义,但并非所有的声明都是定义。n对对“int a;”而言,它既是声明,又是定义。而言,它既是声明,又是定义。n对对“extern a;”而言,它是声明而不是定义。而言,它是声明而不是定义。南昌航空大学信息工程学院南昌航空大学信息工程学院计
31、算机应用技术系刘琳岚计算机应用技术系刘琳岚 27278.9 变量的存储类别变量的存储类别8.9.8 存储类别小结存储类别小结n 从作用域角度分,有局部变量和全局变量。从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:它们采用的存储类别如下:n 局部变量包括:局部变量包括:n 自动变量、自动变量、静态局部变量、寄存器变量。静态局部变量、寄存器变量。n 形式参数可以定义为自动变量或寄存器变量。形式参数可以定义为自动变量或寄存器变量。n 全局变量包括:全局变量包括:n 静态外部变量、外部变量。静态外部变量、外部变量。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计
32、算机应用技术系刘琳岚 28288.9 变量的存储类别变量的存储类别8.9.8 存储类别小结存储类别小结n 从变量存在的时间来区分,有动态存储和静从变量存在的时间来区分,有动态存储和静态存储两种类型。静态存储是程序整个运行时态存储两种类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时间都存在,而动态存储则是在调用函数时临时分配单元。分配单元。n 动态存储:动态存储:n 自动变量、寄存器变量、形式参数。自动变量、寄存器变量、形式参数。n 静态存储:静态存储:n 静态局部变量、静态外部变量、外部变量。静态局部变量、静态外部变量、外部变量。南昌航空大学信息工程学院南昌航空大学信息工
33、程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 29298.9 变量的存储类别变量的存储类别8.9.8 存储类别小结存储类别小结n 从变量值存放的位置来区分,可分为:从变量值存放的位置来区分,可分为:n 内存中静态存储区:内存中静态存储区:n 静态局部变量、静态外部变量、外部变量。静态局部变量、静态外部变量、外部变量。n 内存中动态存储区:内存中动态存储区:n 自动变量和形式参数。自动变量和形式参数。n CPU中的寄存器:中的寄存器:n 寄存器变量。寄存器变量。南昌航空大学信息工程学院南昌航空大学信息工程学院计算机应用技术系刘琳岚计算机应用技术系刘琳岚 30308.9 变量的存储类别变量的存储类别8.9.8 存储类别小结存储类别小结n static对局部变量和全局变量的作用不同。对局部变量和全局变量的作用不同。n 对局部变量来说对局部变量来说,它使变量由动态存储方式它使变量由动态存储方式改变为静态存储方式。改变为静态存储方式。n 对全局变量来说对全局变量来说,它使变量局部化,但仍为它使变量局部化,但仍为静态存储方式。静态存储方式。n 从作用域角度看从作用域角度看,凡有凡有static声明的,其作用声明的,其作用域都是局限的,或者是局限于本函数内,或域都是局限的,或者是局限于本函数内,或者局限于本文件内。者局限于本文件内。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。