在这里先了解两个概念:作用域和生命周期——
作用域:定义了变量或函数的可访问性。它决定了在代码中的哪个部分可以访问到特定的变量或函数。
生命周期:生命周期指的是变量或对象从创建到销毁的过程。
现在我们可以学习全局变量和局部变量了,这两者的最主要的区别就是作用域以及生命周期的不同:
#include<iostream>
int a = 10; //全局变量
int main()
{
int b = 5; //局部变量
return 0;
}
全局变量的作用域是整个程序,因此在同一个程序中的不同文件的全局变量不能重名,而全局变量的生命周期从程序初始时开始,至程序终止时结束。
局部变量的作用域是在一定的函数和代码块中,因此在同一个文件中的全局变量和局部变量是可以重名的,并且在同一函数中被调用时,作用域小的优先被调用。而它的生命周期也是自其被创建开始,至特定函数或代码块结束。
#include<iostream>
using namespace std;
int a = 10; //全局变量
int main()
{
int a = 5; //局部变量
cout<<a<<endl 输出结果为5
}
注意被 ' static ' 关键字修饰的是局部变量成为静态局部变量
int main()
{
int a; 局部变量
static int a; 静态局部变量
return 0;
}
静态局部变量较局部变量只是生命周期被延长至程序结束,而作用域不变。
现在我们来了解一下在C++中的内存区域,一般来说,在我们运行程序的时候操作系统会给程序的不同部分 分配不同的内存空间,它包括一般有四个内存区域——分别是代码区域,全局区域,堆区(Stack)以及栈区(Heap)。
1.代码区域
代码区域又被称为文本区域,它的主要作用是存储程序的二进制代码,包括机器指令等等,该区域的特点是” 只读 “,以防止程序意外地修改自己的指令。
2.全局区域
全局区域又称静态区,该区域被细分为三个区域——数据区,BSS(BSS Segment,Block Started by Symbol)区,常量区
数据区存储的是已经初始化的全局变量和静态变量。
BSS区存储的是没有初始化的全局变量和静态变量。
常量区存储的是被 ' const ' 所修饰的常量,以及字符串常量等等。
3.堆区
用于动态内存分配的区域。该区域由程序员进行管理分配,可以使用 new / malloc 来申请动态内存空间,之后要及时使用 deldte / free 进行内存释放,否则出现内存泄漏,会导致系统的维护成本增加,降低电脑的性能。
4.栈区
栈区用于存储局部变量,函数参数,以及程序执行过程中的临时数据。栈区是由编译器自动分配和释放的,每当函数被调用时,都会在栈上为其分配一个新的栈帧,栈区中的数据是临时的,一旦函数执行完毕,对应的栈帧就会被释放,栈区中的数据也会被销毁。
注意:局部变量在被 ‘ static ’ 关键字修饰时就成为静态局部变量,它会从栈区转移到全局区域。