任务描述
在之前讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了,这种变量有效性的范围称为变量的作用域。不仅对于形参变量,C语言中所有的变量都有自己的作用域,变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
知识学习
(1)局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。另外一种情况是变量定义在某个复合语句内部,其作用域仅限于复合语句的{}之内,离开{}后再使用这种变量也是非法的。
例5.16 任意输入一个正整数给n,求n!。
方法1:
说明:方法1 中,main 函数中s、i、n 都是局部变量且只能在main 函数的{}也就是函数体内起作用。方法2 中,main 函数中的n 是局部变量,复合语句{}内的i 和s 变量也是局部变量,其中i 和s 只能在其所属的{}之内起作用,在之外不起作用,而s 是在其所属函数的{}内其作用,也就是在函数内的复合语句内部s 也起作用。比如将方法2 的输出语句printf("阶乘的结果是%lf\n",s);访到return 0;的上一行就会出现错误。
关于局部变量的作用域还要说明以下几点:
①主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。这一点与其他语言不同,应予以注意。
②形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。
③允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
④在复合语句中也可定义变量,其作用域只在复合语句范围内。
⑤既然有局部变量,数组也可作为局部数组。
(2)全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。
例5.17 任意输入一段英文,统计其中英文字符、数字字符、空格字符和其他字符的格子数量。要求将统计功能用自定义函数来实现,其中输入英文、函数调用、结果输出必须留在main 函数中,且用全局变量和全局数组来实现。
(www.xing528.com)
图5.18 程序运行结果
说明:int a,b,c,d;和char str[1000];就是全局变量和全局数组。它们不属于该程序中的任何一个{},包括不属于2 个函数。从它们定义开始到整个程序最后一行都起作用。另外对于全局变量和全局数组,系统会默认赋值为0,所以上述程序中a=b=c=d=0;此行程序可以直接删除。最后提醒2 点:①全局变量和全局数组优点是共用。但也暴露了缺点,一旦定义之后某操作修改了全局变量和全局数组的值,其值就修改且不可恢复。②如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
(3)外部变量的声明
此前提到全局变量由于其所处的位置,也可以将其称之为外部变量。如果我们将例5.17中程序的全局变量和全局数组的定义放在f 函数和main 函数之间,也称之为全局变量和全局数组。但是它们的作用域由于是向下起作用,所以f 函数内部就不能再使用全局变量a、b、c、d和全局数组str。解决该问题的方法是只需要在f 函数内部做一个外部变量的声明即可,使用extern 来实现。将例5.17 用该方法实现,程序如下:
说明:外部变量的声明只有当全局变量或者全局数组在某些函数之间定义,并不是从程序的一开始就定义,这样就缩小了外部变量的作用域。所以就需要使用外部函数的声明。声明的方式是:自定义函数的函数首部放在主调函数中,在前面加extern,末尾加分号。
任务总结
变程序量中使用的范围不同:作用域(Scope)就是变量的有效范围,变量的作用域取决于变量的访问性。
局部变量:函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部,离开该函数后就是无效的,再使用就会报错。
①主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。
②允许在不同的函数中使用相同的变量名,它们代表不同变量,分配不同的存放单元,互不相干,不会发生混淆。
③复合语句中定义的变量,只限于使用当前函数中,也是复合语句的局部变量,复合语句就是用{}包含起来的语句块。
④形参变量、在函数体内定义的变量都是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。
全局变量:在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括.c 和.h 文件。它的作用域是从声明时刻开始,到程序结束。
①全局变量定义必须在所有函数之外。
②全局变量可加强函数模块之间的数据联系,但是函数又依赖这些变量,降低函数的独立性。
③在同一源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用。
④因为全局变量是共同使用的,在实际编程中一般建议少用或者慎重使用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。