《51单片机轻松入门—基于STC15W4K系列》内容节选 2.1.6 变量作用域 作用域的定义是这样的,如果一个变量在某个文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以使用该变量,所以又称变量在此作用域内“可见”,通常,变量的作用域都是通过它在程序中的位置隐式说明的。 变量只能在定义它或说明它的范围内使用,而在该范围之外是不可见的,按作用域的大小可分为程序级、文件级、函数级及复合语句级(块级),其中程序级的作用域最大,属于程序级作用域的只有全局变量,在构成程序的所有文件中都是可见的,属于文件级的作用域的只有静态全局变量,属于函数级、复合语句级的变量称为局部变量,在下面的讨论中,我们会看到变量的作用域与变量的存储类型有关。 局部变量 : ① 在一个函数内部定义的变量是局部变量,只能在函数内部使用(使用关键字auto,static,默认值auto可省略),在主函数内部定义的变量也是局部变量,其它函数也不能使用主函数中的变量。 ② 局部变量在没有赋值以前的值是不确定的,是以前残留在内存里的随机值,所以在定义局部变量的时候一定要初始化。 ③ 实际参数变量属于主调函数的局部变量。 ④ 形式参数变量属于被调函数的局部变量,它的作用范围仅限于函数内部所用的语句块。 ⑤ 在复合语句中定义的变量是局部于复合语句的变量,只能在复合语句块中使用。 ⑥ 不同函数中可以使用同名变量,它们作用域不同,因此不会发生冲突。 ⑦ 局部变量在函数被调用的过程中动态占有存储单元,调用结束立即释放。 全局变量 : ① 在函数外部定义的变量是全局变量,其作用域是变量定义位置开始至整个程序文件结束,可使用前缀auto,static,默认值auto可省略,实际中全局变量一般是在程序的开头位置定义。 ② 全局变量在没有赋值以前系统默认为0,全局变量初始化是在其定义时进行的,而其初始化仅执行一次,这种规则对于数组、结构体和联合体也同样适用。 ③ 使用全局变量可增加函数间数据传递的渠道,全局变量可以将数据传入在作用域范围内的函数,也可以将数据传回到作用域范围内的其它函数,使用全局变量可让函数传回多个值,但一定要注意全局变量传递数据是数据传递的后门,全局变量在程序中任何地方都可以更新,使用全局变量会降低程序的安全性与移植性,因此,原则上尽量少用全局变量,能用局部变量的就不用全局变量,要避免局部变量全局化。 ④ 使用其它文件的全局变量,可通过extern关键字引用,或用文件包含处理。 ⑤ 局部变量若与全局变量同名,则在局部变量的作用域内,全局变量存在,但不可见,全局变量的作用被屏蔽。 ⑥ 全局变量在程序运行过程中一直占用RAM存储单元。
|