C++ 局部变量、全局变量和 extern

上一篇介绍 C++ 中的 static 涉及到了全局变量,这篇就完整的介绍一下局部变量,全局变量以及 extern

如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢

局部变量

  • 自动变量又称为局部变量/栈区变量,一般习惯称为局部变量
  • 局部变量的内存空间是在栈区的,由OS进行申请和释放
  • OS不会对未初始化的局部变量设初值,一般是一个随机值
  • 局部变量的生命周期(或作用域)在 “{ }” 中,被定义或声明开始,到花括号结束
// 局部变量是被auto修饰的(在C++11中auto又有了新的含义,后面专门写一篇文章介绍)
auto int a = 0;
auto float f = 9.7F;
auto double b = 10.8;

注意

  1. 结构体内的成员变量不是局部变量的意思
  2. 函数的形参也是局部变量,函数执行结束,形参的生命周期(或作用域)就结束了,这与for循环等结构中定义的局部变量相似,所以函数不能返回局部变量的地址,函数执行结束,局部变量被释放,返回的地址成为了野指针
  3. 不同的作用域内可以定义相同名字的变量,若作用域嵌套,名字相同的变量在小作用域内定义的变量在小作用域内起作用,大作用域内定义的变量在大作用域内起作用,两者没有任何关系
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

注意

  1. 局部位置声明全局变量,不可以省略存储类型说明符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
  1. 在多文件编程中,使用其他文件中定义的全局变量需要加上存储类型说明符 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编译器下进行的

发布了25 篇原创文章 · 获赞 3 · 访问量 637

猜你喜欢

转载自blog.csdn.net/xiao_ma_nong_last/article/details/104098778