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编译器下进行的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值