本期介绍

主要介绍:何为static,static修饰局部变量全局变量函数时会发生的变化,产生这些变化的本质原因是什么。。


目录

  1. 概述
  2. 用法
    • 修饰局部变量
    • 修饰全局变量
    • 修饰函数
  3. 总结

概述

Static,顾名思义是静态、静止的意思。在C语言中static是一个用来修饰变量与函数的关键字,被修饰对象的某些性质将发生根本性的改变,而这些变化从某种意义上又似乎契合了“静态”这一含义。那接下来就详细讲一讲static这个关键字的用法吧。


用法

static有三种不同的用法:1.修饰局部变量,2.修饰全局变量,3.修饰函数。下面就依次对每一种用法进行详细的解释和分析。


修饰局部变量

被static修饰的局部变量被称为:静态变量。现在有一段代码,尝试着去思考一下执行结果是什么:

#includevoid test(){int a = 1;a++;printf("%d ", a);}int main(){int i = 0;while (i < 10){test();i++;}return 0;}


我们知道局部变量的生命周期就是其所在的那个局部范围,简单来说就是进这个范围变量就创建,出这个范围变量就销毁。从上面这个例子也可以很好的证实这句话,每次调用函数test,局部变量a就创建,调用结束就把a销毁,所以每次打印才会是2。但如果我用static修饰一下这里的变量a,结果会发生什么样的改变呢?

#includevoid test(){static int a = 1;a++;printf("%d ", a);}int main(){int i = 0;while (i < 10){test();i++;}return 0;


为什么会这样呢?可能有人会说:因为static修饰的变量在一个程序只会执行一次,之后就不会发生改变了。但我想问:这是为什么呢?本质上是因为static修饰的局部变量存储位置改变了,局部变量是存储在栈区内,而静态变量则是存储在静态区内。而这种改变带来的影响就是使得局部变量生命周期变得和整个程序一样长,即:局部变量出了其作用域也将不会销毁,除非程序结束。值得注意的是虽然局部变量的声明周期得到了很大的提升,但他的作用域没有发生任何的改变,还是只能在那个局部的范围内使用。

内存大致上被划分为三个区域:栈区,堆区,静态区。这里只是简单的提一嘴,不会深讲。


修饰全局变量

我们知道全局变量在不同的源文件中是可以使用的,只不过需要先用extern外部声明一下。例如:


但如果用static给这个全局变量进行修饰将发生执行错误的结果:


报错的原因是:无法解析外部指令,出现这种现象的根本原因是:全局变量是具有外部链接属性的,而static修饰的全局变量的时候就把这个外部链接属性变成了内部链接属性。这就导致其他源文件不能使用该全局变量了。所以你才会感觉似乎全局变量的作用域变小了,但生命周期不变,仍是整个工程。


修饰函数

static修饰函数其实和全局变量差不多,因为函数也具有外部链接属性,被static修饰后就变成内部链接属性了,其他源文件不能再使用。


总结

局部变量被static修饰时生命周期将变得和整个程序一样长,但作用域并没有变化。而static修饰全局变量和函数时,就只能在该源文件内部使用,将于外部隔绝起来。


这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。