在C语言中,程序的编译单位是源程序文件, 一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量 而在函数之外定义的变批称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
局部变量说明:
(1) 主函数中定义的变量 (m,n) 也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。
(2) 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。例如,在 fl 函数中定义了变量 c, 倘若在 f2函数中也定义变量 c, 它们在内存中占不同的单元,互不混淆。
(3) 形式参数也是局部变量。例如fl 函数中的形参 a, 也只在 fl 函数中有效。其他函数可以调用 fl 函数,但不能引用 fl 函数的形参a。
(4) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
全局变量说明:
(1) 设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加函数间的联系渠道,通过函数调用能得到一个以上的值。
**为了便于区别全局变量和局部变量,在C程序设计人员中有一个不成文的约定(但非规定),将全局变量名的笫1个字母用大写表示。
(2) 建议不在必要时不要使用全局变最,原因如下。
①全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
②它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的”耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参—形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。
③使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。
(3) 如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变扯被“屏蔽”,即它不起作用。
变量的存储类别
从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量;
从另一个角度,从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
内存中的供用户使用的存储空间的情况。这个存储空间可以分为三部分:
(1) 程序区;
(2) 静态存储区;
(3) 动态存储区。
数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放,在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
在动态存储区中存放以下数据
①函数形式参数。在调用函数时给形参分配存储空间。
②自动变量(未加 static 声明