《第12章C语言中用户标识符的作用域和存储类》由会员分享,可在线阅读,更多相关《第12章C语言中用户标识符的作用域和存储类(11页珍藏版)》请在人人文库网上搜索。
1、第12章 C语言中用户标识符的作用域和存储类对变量的进一步讨论,12.1 局部变量、全局变量和存储分类 12.2 局部变量及其作用域和生存期 12.3 全局变量及其作用域和生存期 12.4 函数的存储分类,按类型,整形变量 实型变量 字符变量,按有效范围 (作用域),局部变量 全局变量,按生存期 (存储类别),auto变量 static变量,局部变量,1。在一个函数内部定义的变量。,#include float f1(int n) int i,j; . char f2(float x,float y) float z; . main() int a,b,c; . ,i,j的有效范围,z的有效范。
2、围,a,b,c的有效范围,2。函数的形式参数。,3。在某个复合语句中定义的变量,n的有效范围,x,y的有效范围,#include main() int a,b,c; . int c; . c=a+b; . ,c的有效范围,复合语句中的变量c和函数体中的c互不影响,在符合语句中的变量都有自己的存储单元。,全局变量,#include int p=1,q=5; float f1(int a) int b; . int f2(int a) int b; . main() int m,n; . ,全局变量就是指在函数体之外定义的变量。,全局变量的有效范围是:从定义变量的位置开始到原文件结束。,p,q的有。
3、效范围,auto变量,当在函数内部或复合语句内定义变量时,也可以使用auto说明符进行说明。 用auto说明的变量,当该变量退出它的有效范围时,系统将自动释放该变量 所占的存储单元。,例如: #include double add(double a,double b) auto double s; s=a+b; return s; main() double y,p,q; scanf(“%lf%lf”, ,退出该函数时,局部变量a,b和s都自动释放,在这里,我们说明了变量s为auto型,所以也会自动释放。再此,我们也可以把auto省略。,register变量,寄存器变量与auto变量基本上相同。
4、,它们之间还是存在一些区别的:用register 说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般变量 那样,占内存空间。,例如: #include int power(int,register int); main() int s; s=power(5,3); printf(%dn,s); int power(int x,register int n) register int p; for(p=1;n;n-) p=p*x; return p; ,特点, 使用寄存器变量,程序运行时,访问存储器 内的值要比访问存于内存中的值快得多。 CPU中的寄存器的数目是有限的,因此只能。
5、说明 少量的寄存器变量。 register变量无地址。 尽量少用register变量。,static变量,例如: #include float fac(int n) static float f=1; f=f*n; return f; main() int j; for(j=1;j=5;j+) printf(%d!=%.0fn,j,fac(j); ,此条语句是在编译时进行的并赋初值,此条语句程序不会执行它;如果定义局部静态变量时没有赋初值,编译时会自动赋初值。用static说明的变量,在退出整个程序时,才释放内存空间。,1!=1 2!=2 3!=6 4!=24 5!=120,如有以下程序 in。
6、t a=2; int f(int n) static int a=3; int t=0; if(n%2) static int a=4; t += a+; else static int a=5; t += a+; return t+a+; main() int s=a, i; for( i=0; i3; i+) s+=f(i); printf(%dn, s); 程序运行后的输出结果是 A)26 B)28 C)29 D)24,extern说明符的作用,当在同一个文件中时使用,#include int p; void f1(int n) int s=1; . main() int a,b,c; 。
7、. ,的有效范围,p,#include void f1(int n) int p=1; . int p; main() int a,b,c; . ,的有效范围,p,局部变量p 的有效范围,#include void f1(int n) extern int p=1; . int p; main() int a,b,c; . ,全局变量 的有效范围,p,extern说明符的作用,不同文件中的使用,f1.c原程序文件,f2.c原程序文件,#include int x,y; /*定义全局变量*/ void fun1(); void fun2(); void fun3(); main() fun1()。
8、; fun2(); fun3(); void fun1() x=111; . ,#include extern int x; void fun2() printf(%dn,x); . void fun3() x+; printf(%dn,x); . ,在此用extern说明x为全局变量,则意味着在此文件中将会引用f1.c文件中原来变量x中的值。,111 112,静态全局变量,不同文件中的使用,f1.c原程序文件,f2.c原程序文件,#include static int n; void func(); main() n=5; printf(file1:%dn,n); func(); ,#include extern int n; void func() printf(file2:%dn,n); . ,虽然在此文件中用extern说明了变量n,想来引用f1.c中的全局变量n。但是,在f1.c文件中的的全局变量被说明了static变量,则意味着,该变量只能在f1.c中被使用。不能被其它文件所使用。