上一篇介绍 C++ 中的 static 涉及到了全局变量,这篇就完整的介绍一下局部变量,全局变量以及 extern
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢
局部变量
- 自动变量又称为局部变量/栈区变量,一般习惯称为局部变量
- 局部变量的内存空间是在栈区的,由OS进行申请和释放
- OS不会对未初始化的局部变量设初值,一般是一个随机值
- 局部变量的生命周期(或作用域)在 “{ }” 中,被定义或声明开始,到花括号结束
// 局部变量是被auto修饰的(在C++11中auto又有了新的含义,后面专门写一篇文章介绍)
auto int a = 0;
auto float f = 9.7F;
auto double b = 10.8;
注意
- 结构体内的成员变量不是局部变量的意思
- 函数的形参也是局部变量,函数执行结束,形参的生命周期(或作用域)就结束了,这与for循环等结构中定义的局部变量相似,所以函数不能返回局部变量的地址,函数执行结束,局部变量被释放,返回的地址成为了野指针
- 不同的作用域内可以定义相同名字的变量,若作用域嵌套,名字相同的变量在小作用域内定义的变量在小作用域内起作用,大作用域内定义的变量在大作用域内起作用,两者没有任何关系
void func() {
int i = 10;
{
cout << i << " ";
int i = 2;
++i;
cout << i << " ";
}
cout << i << endl;
}
// 运行结果:10 3 10
全局变量
- 外部变量一般习惯称为全局变量,存储类型说明符为extern
- 全局变量一般是定义或者声明在全局位置,也就是 “{ }” 外面
- 全局位置定义或者声明全局变量可以省略extern,如下面代码中定义的n1、n2和n3三个全局变量(定义全局变量n2时,省略了extern;定义全局变量n3时,省略了extern,且未初始化,系统默认初始化为0)
extern int n1 = 10; // 完整的定义一个全局变量
int n2 = 9; // 省略 extern 存储类型说明符
int n3; // 省略 extern 存储类型说明符,且未初始化,OS自动初始化为0
void func() {
cout << n1 << " " << n2 << " " << n3 << endl;
}
// 运行结果:10 9 0
注意
- 局部位置声明全局变量,不可以省略存储类型说明符extern,特别需要注意的一点是在局部位置声明全局变量时,不能对全局变量进行初始化操作
// ====== 测试 ======
// file: a.cpp
#include <iostream>
using namespace std;
void func() {
extern int n;
cout << n << endl;
}
// file: b.cpp
#include <iostream>
using namespace std;
int n = 9;
void func();
int main() {
func();
system("pause");
return 0;
}
// 运行结果:9
- 在多文件编程中,使用其他文件中定义的全局变量需要加上存储类型说明符 extern
// ====== 测试 ======
// file: a.cpp
#include <iostream>
using namespace std;
extern int n;
void func() {
cout << n << endl;
}
// file: b.cpp
#include <iostream>
using namespace std;
int n = 9;
void func();
int main() {
func();
system("pause");
return 0;
}
// 运行结果:9
如果未特殊说明,以上测试均是在win10 vs2017 64bit编译器下进行的