弄清楚变量的作用域和生存周期,能够让我们不至于犯低级错误;
局部变量
在初学C语言变量的时候,我们通常将变量写在main函数内;
在函数内部,或者{}块内部的变量称为局部变量;它有以下特点:
- 系统不会帮忙初始化,需要自己初始化
- 在离其最近的花括号中有效
- 出了花括号自动销毁
- 若作用域外又声明了同名的变量,则在自己所在的作用域内忽略外面的同名变量,不会影响外部的同名变量
全局变量
那在函数外声明的普通变量,称为全局变量;
它有以下特点:
- 若不自己初始化,系统会帮忙自动初始化为0或NULL
- 作用域为 全局可见
- 生存期为整个程序期间
- 由于全局可见,所以可能会产生命名冲突
- 由于全局可见,所以可能会产生争用或数据误操作污染变量值
静态变量
若在普通变量前加上static关键字,那么这个变量就变成了静态变量;
它有以下特点:
- 根据变量所处位置,可称作 全局静态变量和局部静态变量
- 对于局部静态变量:
- 只在函数初次被调用时初始化一次
- 生存期延长为整个程序运行期间
- 常用于:缓存、计数等场景
- 对于全局静态变量:
- 作用域被限制为本文件中,其余文件不可以访问此全局静态变量
- 在其余文件中,使用extern也不能访问到此全局静态变量:试想如果可以通过extern在其它文件中访问,那在第三个文件中是否就又可以通过第二个文件间接访问到了?这是一种破坏!
- 好处为:由于只在本文件可见,所以避免了名称冲突
对于静态函数,它的作用域也是在所在的文件中;它与普通函数的区别在于,编译器优化,可以忽略掉未被使用的静态函数;用于减小代码空间占用。
总结
| 变量类型 | 作用域 | 生存期 | 关键字/示例 |
|---|---|---|---|
| 局部变量 | 函数/块内 | 自动 | int x; |
| 静态局部变量 | 函数内 | 静态 | static int x; |
| 全局变量 | 文件内(可跨文件) | 静态 | int global; |
| 静态全局变量 | 当前文件内 | 静态 | static int file_var; |
| 动态分配变量 | 由指针决定 | 手动控制 | malloc/free |
以上对变量的作用域和生存周期的总结,需自己在实战中慢慢感受,才能明白其中深意。