做的好的农产品网站,软件工程师薪资待遇,网站挂马怎么处理,wordpress 模板挂马C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register) 局部变量和全局变量在讨论函数的形参变量时曾经提到#xff0c;形参变量只在被调用期间才分配内存单元#xff0c;调用结束立即释放。这一点表明形参变量只有在函数内才是有效的#xff0c;离开该函…C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register) 局部变量和全局变量 在讨论函数的形参变量时曾经提到形参变量只在被调用期间才分配内存单元调用结束立即释放。这一点表明形参变量只有在函数内才是有效的离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量语言中所有的量都有自己的作用域。变量说明的方式不同其作用域也不同。语言中的变量按作用域范围可分为两种即局部变量和全局变量。 8.8.1 局部变量 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内离开该函数后再使用这种变量是非法的。 例如 int f1(int a) /*函数f1*/ { int b,c; …… } a,b,c有效 int f2(int x) /*函数f2*/ { int y,z; …… } x,y,z有效 main() { int m,n; …… } m,n有效 在函数f1内定义了三个变量a为形参b,c为一般变量。在 f1的范围内a,b,c有效或者说a,b,c变量的作用域限于f1内。同理x,y,z的作用域限于f2内。m,n的作用域限于main函数内。关于局部变量的作用域还要说明以下几点 1) 主函数中定义的变量也只能在主函数中使用不能在其它函数中使用。同时主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数它与其它函数是平行关系。这一点是与其它语言不同的应予以注意。 2) 形参变量是属于被调函数的局部变量实参变量是属于主调函数的局部变量。 3) 允许在不同的函数中使用相同的变量名它们代表不同的对象分配不同的单元互不干扰也不会发生混淆。如在前例中形参和实参的变量名都为n是完全允许的。 4) 在复合语句中也可定义变量其作用域只在复合语句范围内。 例如 main() { int s,a; …… { int b; sab; …… /*b作用域*/ } …… /*s,a作用域*/ } 【例8.12】 main() { int i2,j3,k; kij; { int k8; printf(%d\n,k); } printf(%d\n,k); } 本程序在main中定义了i,j,k三个变量其中k未赋初值。而在复合语句内又定义了一个变量k并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义其值应为5。第7行输出k值该行在复合语句内由复合语句内定义的k起作用其初值为8故输出值为8第9行输出ik值。i是在整个程序中有效的第7行对i赋值为3故以输出也为3。而第9行已在复合语句之外输出的k应为main所定义的k此k值由第4 行已获得为5故输出也为5。 8.8.2 全局变量 全局变量也称为外部变量它是在函数外部定义的变量。它不属于哪一个函数它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量在该函数内使用可不再加以说明。 例如 int a,b; /*外部变量*/ void f1() /*函数f1*/ { …… } float x,y; /*外部变量*/ int fz() /*函数fz*/ { …… } main() /*主函数*/ { …… } 从上例可以看出a、b、x、y 都是在函数外部定义的外部变量都是全局变量。但x,y 定义在函数f1之后而在f1内又无对x,y的说明所以它们在f1内无效。a,b定义在源程序最前面因此在f1,f2及main内不加说明也可使用。 【例8.13】输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。 int s1,s2,s3; int vs( int a,int b,int c) { int v; va*b*c; s1a*b; s2b*c; s3a*c; return v; } main() { int v,l,w,h; printf(\ninput length,width and height\n); scanf(%d%d%d,l,w,h); vvs(l,w,h); printf(\nv%d,s1%d,s2%d,s3%d\n,v,s1,s2,s3); } 【例8.14】外部变量与局部变量同名。 int a3,b5; /*a,b为外部变量*/ max(int a,int b) /*a,b为外部变量*/ {int c; cab?a:b; return(c); } main() {int a8; printf(%d\n,max(a,b)); } 如果同一个源文件中外部变量与局部变量同名则在局部变量的作用范围内外部变量被“屏蔽”即它不起作用。 8.9 变量的存储类别 8.9.1 动态存储方式与静态动态存储方式 前面已经介绍了从变量的作用域即从空间角度来分可以分为全局变量和局部变量。 从另一个角度从变量值存在的作时间即生存期角度来分可以分为静态存储方式和动态存储方式。 静态存储方式是指在程序运行期间分配固定的存储空间的方式。 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。 用户存储空间可以分为三个部分 1) 程序区 2) 静态存储区 3) 动态存储区 全局变量全部存放在静态存储区在程序开始执行时给全局变量分配存储区程序行完毕就释放。在程序执行过程中它们占据固定的存储单元而不动态地进行分配和释放 动态存储区存放以下数据 1) 函数形式参数 2) 自动变量未加static声明的局部变量 3) 函数调用实的现场保护和返回地址 对以上这些数据在函数开始调用时分配动态存储空间函数结束时释放这些空间。 在c语言中每个变量和函数有两个属性数据类型和数据的存储类别。 8.9.2 auto变量 函数中的局部变量如不专门声明为static存储类别都是动态地分配存储空间的数据存储在动态存储区中。函数中的形参和在函数中定义的变量包括在复合语句中定义的变量都属此类在调用该函数时系统会给它们分配存储空间在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。 例如 int f(int a) /*定义f函数a为参数*/ {auto int b,c3; /*定义bc自动变量*/ …… } a是形参bc是自动变量对c赋初值3。执行完f函数后自动释放abc所占的存储单元。 关键字auto可以省略auto不写则隐含定为“自动存储类别”属于动态存储方式。 8.9.3 用static声明局部变量 有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值这时就应该指定局部变量为“静态局部变量”用关键字static进行声明。 【例8.15】考察静态局部变量的值。 f(int a) {auto b0; static c3; bb1; cc1; return(abc); } main() {int a2,i; for(i0;i3;i) printf(%d,f(a)); } 对静态局部变量的说明 1) 静态局部变量属于静态存储类别在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量即动态局部变量属于动态存储类别占动态存储空间函数调用结束后即释放。 2) 静态局部变量在编译时赋初值即只赋初值一次而对自动变量赋初值是在函数调用时进行每调用一次函数重新给一次初值相当于执行一次赋值语句。 3) 如果在定义局部变量时不赋初值的话则对静态局部变量来说编译时自动赋初值0对数值型变量或空字符对字符变量。而对自动变量来说如果不赋初值则它的值是一个不确定的值。 【例8.16】打印1到5的阶乘值。 int fac(int n) {static int f1; ff*n; return(f); } main() {int i; for(i1;i5;i) printf(%d!%d\n,i,fac(i)); } 8.9.4 register变量 为了提高效率C语言允许将局部变量得值放在CPU中的寄存器中这种变量叫“寄存器变量”用关键字register作声明。 【例8.17】使用寄存器变量。 int fac(int n) {register int i,f1; for(i1;in;i) ff*i return(f); } main() {int i; for(i0;i5;i) printf(%d!%d\n,i,fac(i)); } 说明 1) 只有局部自动变量和形式参数可以作为寄存器变量 2) 一个计算机系统中的寄存器数目有限不能定义任意多个寄存器变量 3) 局部静态变量不能定义为寄存器变量。 8.9.5 用extern声明外部变量 外部变量即全局变量是在函数的外部定义的它的作用域为从变量定义处开始到本程序文件的末尾。如果外部变量不在文件的开头定义其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明就可以从“声明”处起合法地使用该外部变量。 【例8.18】用extern声明外部变量扩展程序文件中的作用域。 int max(int x,int y) {int z; zxy?x:y; return(z); } main() {extern A,B; printf(%d\n,max(A,B)); } int A13,B-8; 说明在本程序文件的最后1行定义了外部变量AB但由于外部变量定义的位置在函数main之后因此本来在main函数中不能引用外部变量AB。现在我们在main函数中用extern对A和B进行“外部变量声明”就可以从“声明”处起合法地使用该外部变量A和B。转载于:https://www.cnblogs.com/hnrainll/archive/2011/08/26/2155079.html