全局变量
认识 全局变量
- 定义在函数外的变量就是全局变量
- 全局变量具有全局的生存期和作用域
- 它们与任何函数无关
- 任何函数(定义在全局变量后的的函数)内部都可以使用它们
例如:
int f(void);
int gAll = 12;
int main(void){
//__func__ 可以打印出当前函数的函数名,下划线一边是两个
printf("in %s gAll = %d\n", __func__, gAll);
//全局变量可以直接使用,不需要再声明
f();
printf("again in %s gAll = %d\n", __func__, gAll);
//函数内对全局变量值的改变在 main函数中依然存在
return 0;
}
int f(void) {
printf("in %s gAll = %d\n", __func__, gAll);
gAll += 2;
printf("again in %s gAll = %d\n", __func__, gAll);
return gAll;
}
输出:
in main gAll = 12
in f gAll = 12
again in f gAll = 14
again in main gAll = 14
全局变量的初始化
- 没有初始化的全局变量默认值为 0
- 指针默认为 NULL
- 只能用编译时刻已知[^1]的值来初始化全局变量
- 全局变量的初始化发生在main函数之前
注释1:
int gAll = 12;
int g = gAll;//报错
int main(void) {
return 0;
}
下面这段代码在某些编译器(dev c++)上是可以编译的,但是在 vs 上是不能编译的
const int gAll = 12;
int g = gAll;
int main(void) {
return 0;
}
但是,这种方式是不推荐的
被隐藏的全局变量
- 如果函数内部存在与全局变量同名的变量,则全局变量被隐藏。
int f(void);
int gAll = 12;
int main(void) {
printf("in %s gAll = %d\n", __func__, gAll);
f();
printf("again in %s gAll = %d\n", __func__, gAll);
return 0;
}
int f(void) {
int gAll = 2;//仅在这个范围内适用
printf("in %s gAll = %d\n", __func__, gAll);
gAll += 2;
printf("again in %s gAll = %d\n", __func__, gAll);
return gAll;
}
输出:
in main gAll = 12
in f gAll = 2
again in f gAll = 4
again in main gAll = 12
即使 gAll 在 main 函数中被覆盖,f 函数中的 gAll 也是不会被该改变的
为什么会这样?自己思考一下。
静态本地变量
- 在本地变量定义时加上 static 修饰符就成为静态本地变量
- 当离开函数的生存期后,静态本地变量会继续存在并保持其值
- 静态本地变量的初始化只会在第一次进入这个函数时进行,