C语言中的作用域与生命周期

作用域(scope)是程设计概念,通常来说,一段程序代码中所⽤到的名字并不总是有效的,而限定这个名字的可⽤性的代码范围就是这个名字的作用域。

  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程(项目)

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

  1. 局部变量的生命周期是:进⼊作用域变量创建,生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期是:整个程序的生命周期。

static 修饰局部变量:

复制代码
#include <stdio.h>
void test()
{
	static int i = 0;// static修饰局部变量
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

对比有无static的效果,理解 static 修饰局部变量的意义。

  • 去掉static的test函数中的局部变量i是每次进⼊test函数先创建变量(生命周期开始)并赋值为0,然后 ++,再打印,出函数的时候变量生命周期将要结束(释放内存)。
  • 有static的代码中,我们从输出结果来看,i的值有累加的效果,其实 test函数中的i创建好后,出函数的时候是 不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。

结论:static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变的。

static修饰全局变量:

extern 是用来声明外部符号的,如果一个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用。

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。 本质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以使用;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的。

注意:如果⼀个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用 static修饰。

相关推荐
黄焖鸡能干四碗4 分钟前
系统安全设计方案,软件系统安全设计方案
开发语言·数据库·安全·vue·系统安全
程序员秘密基地16 分钟前
基于html,css,vue,vscode,java,springboot,mysql数据库,在线考勤,管理系统
java·vue.js·spring·html·web app
dragoooon3424 分钟前
C++——string的了解和使用
c语言·开发语言·c++·学习·学习方法
格林威41 分钟前
Baumer工业相机堡盟工业相机如何通过DeepOCR模型识别判断数值和字符串的范围和相似度(C#)
开发语言·人工智能·python·数码相机·计算机视觉·c#·视觉检测
sanggou43 分钟前
InterSystems IRIS安装部署
开发语言
hello 早上好1 小时前
多线程(1)
java
presenttttt1 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(五)
开发语言·python·opencv·计算机视觉
paopaokaka_luck1 小时前
基于Spring Boot+Vue的DIY手工社预约管理系统(Echarts图形化、腾讯地图API)
java·spring boot·后端
kk_stoper1 小时前
使用Ruby接入实时行情API教程
java·开发语言·javascript·数据结构·后端·python·ruby
我会冲击波2 小时前
告别flag与status:如何为你的布尔值(boolean)变量优雅命名?
java·后端