目录
前言:
一、几个概念
1.变量
2.局部变量和全局变量
3.变量的作用域
4.变量的生命周期
二、static关键字的作用
三、static关键字修饰局部变量
四、static关键字修饰全局变量
五、static关键字修饰函数
写在最后:
前言:
static,英文意思静态的,作为C语言常用关键字中一个很重要的关键字,其用法多样且比较难以理解。
一、几个概念
首先,介绍几个与static关键字用法有关的重要概念,便于后面知识的更好理解。
1.变量
变量:C语言中可变化的值用变量来表示
变量的命名规则:
(1)只能由字母(包括大写和小写)、数字和下划线(_)组成
(2)不能以数字开头
(3)长度不超过63个字符
(4)变量名区分大小写
(5)变量名不能使用关键字
2.局部变量和全局变量
这里展示一段代码示例。
#include<stdio.h>
int a = 2020;//全局变量
int main()
{
int b = 2021;//局部变量
int a = 2023;//局部变量
printf("a = %d", a);
return 0;
}
总结:
局部变量:定义在函数体内部的变量,只能在函数体内部使用。
全局变量:定义在函数体外部的变量,在整个程序中都可以使用。
我们再康康上面这段代码会发现,变量a既为全局变量又为局部变量,即出现了局部变量和全局变量同名的情况,输出变量a,运行结果如下:
总结:允许局部变量和全局变量同名,且同名的时候,局部变量优先使用。
3.变量的作用域
作用域:一段程序代码中所用到的名字并不总是有效或者可用,而限定这个名字可用性的代码范围就是这个名字的作用域。
(1)局部变量的作用域是变量所在的局部范围。
(2)全局变量的作用域是整个工程。
4.变量的生命周期
变量的生命周期:变量的创建到变量的销毁之间的一个时间段。
(1)局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
(2)全局变量的生命周期:整个程序的生命周期。
二、static关键字的作用
在C语言中,static关键字是用来修饰变量和函数的。
1.修饰局部变量(称为静态局部变量)
2.修饰全局变量(称为静态全局变量)
3.修饰函数(称为静态函数)
三、static关键字修饰局部变量
我们仍然先展示一段示例代码:
#include<stdio.h>
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。
我们用static修饰text函数中的局部变量a,代码如下:
#include<stdio.h>
void text()
{
static int a = 0;
a++;
printf("%d ", a);
}
int main()
{
int i= 0;
for (i= 0; i < 10; i++)
{
text();
}
return 0;
}
运行结果如下:
我们可以发现,当static修饰局部变量a时,程序运行结果为1到10。由运行结果分析,当static修饰局部变量a后,变量a在text函数中进入后创建,出函数并未后销毁,而是保留了上一次循环a出text函数后的值继续作用,即局部变量a被static关键字修饰后,作用域不变,生命周期变长了。
本质上来讲的话,需要简单了解以下知识。
内存可分为栈区、堆区、静态区(也可称为全局区)等。栈区存放函数的参数值、局部变量的值等,这些数据进入作用域创建,出作用域被销毁。堆区用于动态内存分配等。静态区存储全局变量和静态变量,这些变量创建好后,直到程序结束后才释放。
总结:
(1)static关键字修饰局部变量不改变作用域,但是生命周期变长。
(2)本质上,static关键字修饰局部变量,改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放。局部变量被static修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。
四、static关键字修饰全局变量
首先展示代码,我们在同一个工程中创建两个源文件,在左边源文件中定义全局变量a的值,在右边源文件中使用关键字extern,声明外部变量a。
在右边源文件中打印输出a的值为2022,运行结果如下:
若用static关键字修饰左边源文件里的全局变量a,再次运行右边源文件,运行结果出错:
总结:
(1)全局变量本身具有外部链接属性,可使用extern关键字声明外部文件变量,实现跨文件变量使用。但是如果全局变量被static关键字修饰后,这个外部链接属性就变成了内部链接属性,全局变量作用域变小,全局变量只能在自己所在的源文件内部使用。
(2)static关键字修饰全局变量,不改变生命周期,作用域变小。
五、static关键字修饰函数
static关键字修饰函数与修饰全局变量相似,我们在同一个工程中创建两个源文件,在左边源文件中定义函数max,在右边源文件中使用关键字extern,声明外部函数max。
在右边源文件中打印输出max的值为2,运行结果如下:
若用static关键字修饰左边源文件里的函数max,再次运行右边源文件,运行结果出错:
总结:函数本身具有外部链接属性,可使用extern关键字声明外部文件函数,实现跨文件函数使用。但是如果函数被static关键字修饰后,函数只能在自己所在的源文件内部使用,不能在其他源文件内使用。
写在最后:
我们可以使用static关键字修饰变量或者函数防止被误引用,如果不是对外提供的全局变量和函数,最好都用static关键字修饰,保证数据安全。文章来源:https://www.toymoban.com/news/detail-774157.html
我们下次见咯~~~文章来源地址https://www.toymoban.com/news/detail-774157.html
到了这里,关于C语言之static关键字详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!