1、相同之处
名称 | 作用域 | 生存周期 | 存储位置 | 默认值 | 初始化次数 |
---|---|---|---|---|---|
局部静态变量 | 函数之内 | 应用生命周期 | 静态存储区 | 0 | 只能1次 |
普通局部变量 | 函数之内 | 函数周期 | 栈 | 系统随机 | 多次赋值 |
全局静态变量 | 源文件之内 | 应用生命周期 | 静态存储区 | 0 | 只能1次 |
普通全局变量 | 整个工程 | 函数周期 | 栈 | 系统随机 | 多次赋值 |
静态函数 | 源文件之内 | 应用生命周期 | 静态存储区 | ||
普通函数 | 整个工程 | 弹栈出栈 | 栈 |
注意点:
由上表可以看出static修饰局部变量和全局变量改变了变量的作用域和生存周期(存储的位置不同导致),还有默认值。
普通局部变量的作用域是在整个应用之内,是把变量定义到源文件中,另一个源文件通过extern 来调用,并且可以使用和修改该变量;
例如:
//TestStatic2.c
int testVar2 = 100;
static int testStaticVar3 = 300;
void showInnerVar(){
printf("testVar2 is :%d\n",testVar2);
}
//TestStatic.c
int main(void) {
extern int testVar2;
showInnerVar();
testVar2 = 1111;
showInnerVar();
return 0;
}
输出的结果为:
testVar2 is :100
testVar2 is :1111
2、不同之处
类是C++相对于C特有的,所以static关键字在类中的作用C全部没有;
名称 | 作用域 | 生存周期 | 存储位置 | 默认值 | 初始化位置 |
---|---|---|---|---|---|
静态数据成员 | 类 | 应用生命周期 | 静态存储区 | 0 | |
普通数据成员 | 对象 | 对象生命周期 | 栈或者堆 | 系统随机 | 函数体或初始化表 |
静态成员函数 | 类 | 应用生命周期 | 静态存储区 | ||
普通成员函数 | 对象 | 对象生命周期 | 栈或者堆 |
注意:
static在类中的作用是限制了该成员是类的,而非对象的这一唯一性。