变量的作用域:即变量的作用范围(有效范围)。
表现为变量有的可以在整个程序或其他程序中进行引用,有的则只能在局部范围内引用。
按其作用域范围可分为 局部变量和全局变量
变量的生存期:变量从生成到被撤销的这段时间。实际上就是变量占用内存的时间。
按其生存期可分为 动态变量和静态变量
变量只能在其生存期内被引用,而变量的作用域直接影响变量的生存期。
局部变量的作用域和生存期
在函数内部作定义说明的变量,也成内部变量,仅限于函数内。
生存期是从函数被调用的时刻到函数返回调用处的时刻(静态局部变量除外)。
注意:
①主函数main()中定义的变量也是局部变量,其他函数不可以使用,同样main()函数中也不可以使用其他函数中的
②形参变量属于被调用函数的局部变量;实参变量则属于全局变量或调用函数的局部变量。
③允许在不同的函数中使用相同的变量名,他们代表不同的对象,分配不同的单元,互不干扰,也不会混淆
④在复合语句中定义的变量也是局部变量,生存期一样。
全局变量的作用域和生存期
在函数外部作定义说明的变量。也称为外部变量。它不属于哪一个函数,而是属于一个源程序文件。
作用域:从定义变量的位置开始到本源文件结束,及有extern说明的其他源文件。不可以在定义之前使用
生存期:与程序相同。从程序执行开始到之行结束。
说明:
Ⅰ.尽量少使用全局变量
①全局变量在程序全部执行中始终占用存储单元
②降低了函数的独立性、通用性、可靠性及可移植性。
③降低程序清晰型、易出错。
Ⅱ.若全局变量与局部变量同名,则局部变量被屏蔽。要引用全局变量,须在变量名前加上两个冒号(::)
Ⅲ.全局变量定义须在所有的函数之外,且只能定义一次,可赋初始值。
一般形式: extern 类型说明符 全局变量名1[ = 初始值],....,全局变量名n[ = 初始值n]; //extern可不要
Ⅳ.对全局变量进行说明,可扩展全局变量的作用域。全局变量的说明一定要加extern 且不可以赋初始值
Ⅴ.全局变量的定义和全局变量的说明区分。定义可以赋初始值,说明不可以。但是,
void gx(), gy();
void main()
{
extern intx, y; //全局变量说明
printf("1:x=%d\ty=%d\n", x, y);
y = 246;
gx();
gy();
}
extern int x, y; //全局变量说明
void gx()
{
x = 135;
printf("2:x=%d\ty=%d\n", x, y);
}
int x = 0, y = 0; //全局变量定义
void gy()
{
printf("3:x=%d\ty=%d\n", x, y);
}
变量的存储类型
变量是对程序中数据的存储空间的抽象。
变量的属性:①数据类型:变量所持有的性质,规定了取值范围和可参与的运算
②存储类型:存储方式。规定了变量占用内存空间的方式。分为静态存储和动态存储
静态存储类型的变量:在程序运行中系统分配固定的内存单元,并一直保持不变,直至整个程序结束,内存空间才被释放。
全局变量就是静态存储。
动态存储类型的变量:在程序运行期间根据需要进行动态分配内存单元,使用完毕立即释放。例如函数的形参
在C语言中,对变量的存储类型说明有以下四种:auto--自动型 register--寄存器型 static--静态型 extern--外部型
变量定义的完整形式:存储类型说明符 数据类型说明符 变量名1,变量名2,..变量名n;
在函数外部没有定义类型的变量都是静态变量,
auto自动型变量不可以定义在函数外部,只能在函数内部,在函数内部,默认是auto
extern全局变量可以在另外一个文件中调用 static不可以。
寄存器变量 register属于动态存储变量。只有局部自动变量和形式参数才可以定义寄存器变量。register是过时的修饰符
函数的作用域
内部函数和外部函数
内部函数 只能在本文件调用 加上static即可
外部函数 作用域整个源程序 加上extern 缺省是默认是extern