作用域与生存期
作用域(scope)
通常来说,限定某个名字的可用性的代码范围就是该名字的作用域。
根据变量声明时的位置,可将其分为全局变量和局部变量。
全局变量(global) 也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。程序中所有未再次被声明的名字都会被认为是全局声明中的名字。
局部变量(local) 也称为内部变量,它是在函数内部定义说明的。其作用域仅限于函数内,即其所在的花括号{…}内,离开该函数后再使用这种变量是非法的。
生存期
生存期即变量值存在的时间,可以分为静态存储方式和动态存储方式。可见生存期只是和变量存储的位置相关。
静态存储(static) 全局变量即属于静态存储,通常是由编译器在编译时分配分定存储单元(静态存储区)并一直保持不变,在函数调用结束后不消失而保留原值,生存期为整个程序运行过程。
动态存储(auto) 函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),如不专门声明为 static 存储类别,都属动态存储,都是系统在运行时动态地分配存储空间的,数据存储在动态存储区(栈区)中,在函数调用结束时就自动释放这些存储空间。
#include <stdio.h>
static int a;
const int b = 1;
main(){
auto int c;
const int d = 1;
static int e;
}
如图,a是一个全局静态变量,未初始化,其默认值为0,可读可写,写入的值在函数调用结束后不消失而是保留,一直储存在静态存储区,作用域是整个源程序,生存期为整个程序运行过程;
b是一个全局静态常量,省略了static,已初始化,值为1,可读不可写,一直储存在静态存储区,作用域是整个源程序,生存期为整个程序运行过程;
c是一个局部动态变量,未初始化,其默认值是不确定随机数,只有在函数被调用时才分配存储空间,可读可写,写入的值在函数调用结束后消失,作用域是其所在的花括号{…}内,生存期从函数调用开始到函数调用结束;
d是一个局部动态常量,省略了auto,已初始化,值为1,只有在函数被调用时才分配存储空间,可读不可写,作用域是其所在的花括号{…}内,生存期从函数调用开始到函数调用结束;
e是一个局部静态变量,未初始化,其默认值为0,可读可写,写入的值在函数调用结束后不消失而是保留,一直储存在静态存储区,作用域是其所在的花括号{…}内,生存期为整个程序运行过程。
本博客参考了百度百科,维基百科及以下资料参考资料1,参考资料2
谢谢观看!