C语言之static关键字详解

目录

 前言:

一、几个概念

1.变量

2.局部变量和全局变量

3.变量的作用域

4.变量的生命周期

二、static关键字的作用

三、static关键字修饰局部变量

四、static关键字修饰全局变量

 五、static关键字修饰函数

 写在最后:


 前言:

           static,英文意思静态的,作为C语言常用关键字中一个很重要的关键字,其用法多样且比较难以理解。

一、几个概念

         首先,介绍几个与static关键字用法有关的重要概念,便于后面知识的更好理解。

1.变量

   变量:C语言中可变化的值用变量来表示

变量的命名规则:

(1)只能由字母(包括大写和小写)、数字下划线(_)组成

(2)不能数字开头

(3)长度不超过63个字符

(4)变量名区分大小写

(5)变量名不能使用关键字

2.局部变量和全局变量

   这里展示一段代码示例。

#include

int a = 2020;//全局变量
int main()
{
	int b = 2021;//局部变量
	int a = 2023;//局部变量
	printf("a = %d", a);
	return 0;
}

总结:

局部变量:定义在函数体内部的变量,只能在函数体内部使用。

全局变量:定义在函数体外部的变量,在整个程序中都可以使用。 

       我们再康康上面这段代码会发现,变量a既为全局变量又为局部变量,即出现了局部变量和全局变量同名的情况,输出变量a,运行结果如下:

C语言之static关键字详解_第1张图片

 总结:允许局部变量和全局变量同名,且同名的时候,局部变量优先使用。

3.变量的作用域

   作用域:一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。

(1)局部变量的作用域是变量所在的局部范围。

(2)全局变量的作用域是整个工程。

4.变量的生命周期

变量的生命周期:变量的创建到变量的销毁之间的一个时间段。

(1)局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。

(2)全局变量的生命周期:整个程序的生命周期。

二、static关键字的作用

       在C语言中,static关键字是用来修饰变量和函数的。

       1.修饰局部变量(称为静态局部变量)

       2.修饰全局变量(称为静态全局变量)

       3.修饰函数(称为静态函数)

三、static关键字修饰局部变量

       我们仍然先展示一段示例代码:

#include

void text()
{
	int a = 0;
	a++;
	printf("%d ", a);
}
int main()
{
	int i= 0;
	for (i= 0; i < 10; i++)
	{
		text();
	}
	return 0;
}

     main函数中使用for循环,将text函数循环十次。代码中变量a作为局部变量,text函数中a初始值为0,a++后a的值为1,打印输出1,a每次循环进入text函数创建,出text函数销毁。故程序最后运行结果为10个1。

C语言之static关键字详解_第2张图片

我们用static修饰text函数中的局部变量a,代码如下:

#include

void text()
{
	static int a = 0;
	a++;
	printf("%d ", a);
}
int main()
{
	int i= 0;
	for (i= 0; i < 10; i++)
	{
		text();
	}
	return 0;
}

运行结果如下:

C语言之static关键字详解_第3张图片 

       我们可以发现,当static修饰局部变量a时,程序运行结果为1到10。由运行结果分析,当static修饰局部变量a后,变量a在text函数中进入后创建,出函数并未后销毁,而是保留了上一次循环a出text函数后的值继续作用,即局部变量a被static关键字修饰后,作用域不变,生命周期变长了。

      本质上来讲的话,需要简单了解以下知识。

      内存可分为栈区、堆区、静态区(也可称为全局区)等。栈区存放函数的参数值、局部变量的值等,这些数据进入作用域创建,出作用域被销毁。堆区用于动态内存分配等。静态区存储全局变量和静态变量,这些变量创建好后,直到程序结束后才释放。

C语言之static关键字详解_第4张图片

总结:

(1)static关键字修饰局部变量不改变作用域,但是生命周期变长

(2)本质上,static关键字修饰局部变量,改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放。局部变量被static修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。

四、static关键字修饰全局变量

       首先展示代码,我们在同一个工程中创建两个源文件,在左边源文件中定义全局变量a的值,在右边源文件中使用关键字extern,声明外部变量a。

C语言之static关键字详解_第5张图片

        在右边源文件中打印输出a的值为2022,运行结果如下:

C语言之static关键字详解_第6张图片

若用static关键字修饰左边源文件里的全局变量a,再次运行右边源文件,运行结果出错:

C语言之static关键字详解_第7张图片

 总结:

(1)全局变量本身具有外部链接属性,可使用extern关键字声明外部文件变量,实现跨文件变量使用。但是如果全局变量被static关键字修饰后,这个外部链接属性就变成了内部链接属性,全局变量作用域变小,全局变量只能在自己所在的源文件内部使用。

(2)static关键字修饰全局变量,不改变生命周期作用域变小

 五、static关键字修饰函数

       static关键字修饰函数与修饰全局变量相似,我们在同一个工程中创建两个源文件,在左边源文件中定义函数max,在右边源文件中使用关键字extern,声明外部函数max。

C语言之static关键字详解_第8张图片

       在右边源文件中打印输出max的值为2,运行结果如下:

C语言之static关键字详解_第9张图片

       若用static关键字修饰左边源文件里的函数max,再次运行右边源文件,运行结果出错:

C语言之static关键字详解_第10张图片

C语言之static关键字详解_第11张图片

 总结:函数本身具有外部链接属性,可使用extern关键字声明外部文件函数,实现跨文件函数使用。但是如果函数被static关键字修饰后,函数只能在自己所在的源文件内部使用不能在其他源文件内使用。

 写在最后:

       我们可以使用static关键字修饰变量或者函数防止被误引用,如果不是对外提供的全局变量和函数,最好都用static关键字修饰,保证数据安全。

       我们下次见咯~~~

你可能感兴趣的:(c语言,开发语言,c#)