Logo

郎哥编程

变量的作用域与生存周期

2024-05-14 24

一、变量的作用域

变量作用域是指我们在程序中命名的变量在多大范围能够访问到它。在函数内部声明的变量,在函数外部是否能够访问?在源程序文件函数外声明的变量,在函数内部是否能够访问?这些都是变量作用域要解决的问题。下面是一段有关变量作用域范围的代码。

#include <stdio.h>
// 声明area函数
void area(double r);
// 定义变量π
double pi = 3.14;
void main()
{
	// 调用area函数
	area(2.1);
}
// 定义area函数
void area(double r)
{
	double s = r*pi*pi;
	printf("%.2f",s);
}

上面的代码是求圆的面积。在源程序文件头部声明了变量π和函数area,变量PI被定义的area函数在内部使用,area函数求出圆的面积并输出结果。

在函数外声明的变量PI称为全局变量,其作用域是整个源程序文件,源程序文件内所有的函数都可以使用访问全局变量,但需要遵循先声明后使用的原则。

在area函数内声明的变量s为函数内部声明的变量,在函数内部声明的变量称为局部变量,其作用域仅限于函数内部,在函数外部不能访问局部变量。

在上面的探讨中,我们了解了局部变量和全局变量的作用域。不过还有个问题没有弄明白,当全局变量的名称和函数体内局部变量的名称相同时,哪个变量会被使用呢?

#include <stdio.h>
// 声明area函数
void area(double r);
// 定义变量π
double pi = 3.14;
void main()
{
	// 调用area函数
	area(2.1);
}
// 定义area函数
void area(double r)
{
	// 局部变量pi与全局变量pi重名
	double s,pi = 0.314;
	s = r*pi*pi;
	printf("半径为%.2f,圆的面积为:%.2f\n",r,s);
}

上面的代码在area函数内部又声明了一个变量pi,这个变量pi是局部变量,其值为一个错误的π值。那么问题来了,在程序执行过程中,计算圆的面积是用局部变量的pi?还是用全局变量的pi呢? 

在执行程序的过程中,程序输出如下信息:

程序的执行结果给出了答案,当全局变量的名称和函数体内局部变量的名称相同时,在函数体内声明的局部变量将覆盖与其名称相同的全局变量。

二、变量的生命周期

前面我们从变量访问范围的角度学习了全局变量和局部变量。变量除了访问范围,还有在内存持续的时间,也就是变量的生命周期,也称为变量的生存期。从变量生存期角度可以将变量分为静态变量和动态变量。

静态变量和动态变量的区别主要是存储在程序内存不同的区域,静态变量主要存储在程序的全局区,动态变量主要存储在程序的栈区。此外程序内存还包括代码区和堆区,代码区存储程序的二进制代码,堆区为开发者可以管理的内存区域,开发者通过new运算符来申请内存空间,申请的内存空间就在堆区内分配,当申请的内存空间使用完毕,开发者需要释放该内存空间。

全局区主要存储源程序文件内声明的全局变量、静态变量和常量,这些变量可以在整个程序内被访问,程序结束后该内存区被释放。栈区主要存储函数参数、在函数内部声明的局部变量,当函数执行完成后,在栈区内存储的局部变量和函数参数占用的内存空间会被自动释放。

C语言的关键字static用于声明一个静态变量,在全局变量名称前面添加static关键字,表示该全局变量为静态全局变量。例如:

static int count;

静态全局变量的访问范围仅限于静态全局变量所在的源程序文件,若C程序由多个源程序文件构成,其它源程序文件不能访问此变量,但可以访问在该源程序文件内声明的全局变量。

在函数内部也可以声明静态局部变量,静态局部变量会被分配到全局区,函数执行完成后,此变量不会被释放,当函数再次调用后,变量依然可以被使用,且保留上次函数执行后的值。

声明静态全局变量或静态局部变量时都要赋初值,若开发者没有给静态变量赋初值,编译器会自动将静态变量初始化为0,在程序运行过程中,静态变量仅执行一次赋初值操作。

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论