在c语言中:
static是用来修饰变量和函数的:
1.修饰局部变量-称为静态局部变量
2.修饰全局变量-称为全局变量
3.修饰函数-称为静态函数
普通的局部变量:自动创建,自动销毁,生命周期为局部内
1.修饰局部变量-称为静态局部变量
![](https://i-blog.csdnimg.cn/blog_migrate/fe816b7dab2ca9554afcebd827dab3eb.png)
这是没有static修饰的局部变量,可以看出执行while的时候每一次的循环都需要重新调用一次test(),但是test里面的变量是局部变量,出了作用域以后自动销毁,并不记录上一次变量的值
![](https://i-blog.csdnimg.cn/blog_migrate/ad3a6fbce2d30cc80e2d420801ffff96.png)
当static修饰局部变量的时候改变了这个局部变量的生命周期
![](https://i-blog.csdnimg.cn/blog_migrate/856971f5ea3a8f59d109484f6241182a.png)
以上是变量在计算机中位置
Static修饰局部变量,是改变了变量的存储类型,本来局部变量是放在栈区的,被static修饰后存放在内存的静态区了,因为存储类型改变的缘故,从而导致了生命周期变长。
但是,不影响作用域
2.修饰全局变量-称为全局变量
修饰全局变量一般在多个文件中使用,这里先声明如果想在a文件中使用b文件中的全局变量必须要在a文件中用extern来修饰全局变量,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/a89e9db4cfafb44f1bd7af62054b302f.png)
全局变量本身是具有外部链接属性的,就算不加extern也一样,只不过不能在别的文件中使用
当我们加入static后:
![](https://i-blog.csdnimg.cn/blog_migrate/81d88fa9ba3920c76e1ee28251c1201b.png)
发现就算有extern也不能调用另一个文件中被static修饰的全局变量了
原因:
1.static修饰全局变量后,将外部链接属性变成了内部链接属性。
2.此时的全局变量只能在自己的.c文件中使用,其他文件无法链接使用
给我们的感觉:static就像是能影响变量的作用域
3.修饰函数-称为静态函数
修饰函数其实本质上和修饰全局变量比较类似,大多都是在多文件的情况下使用
![](https://i-blog.csdnimg.cn/blog_migrate/88b565d773eb0bb3856f8f9bbd188f7d.png)
函数也是具有外部链接属性
static修饰函数后,将外部链接属性变为了内部链接属性
使得这个函数只能在自己的.c文件中使用,其他的.c文件无法链接使用
总结:static就像是一种保护机制,在全局变量和函数中能够缩小变量的作用域,在局部变量中延长了他的生命周期,当我们想创建一个变量或者函数又不想这个变量被其他文件使用,或者不想他被改变的时候可以用static对变量或者函数进行修饰。