引入
首先我们看两个例子:
例1
#include<stdio.h> void test() { int i = 0; i++; printf("%d", i); } int main() { int a = 0; while (a < 10) { test(); a++; } return 0; }
例2
#include<stdio.h> void test() { static int i = 0; i++; printf("%d", i); } int main() { int a = 0; while (a < 10) { test(); a++; } return 0; }
那么请问例1和例2的输出结果一样吗?答案是肯定不一样的。我们来看一下例1和例2分别输出的结果。
为什么两个的输出结果不一样的,原因就是在static修饰了局部变量。接下来我们仔细分析一下原因。
一、static的简单认识
- 在c语言中,static是一个常见的关键字, 可用来修饰。
- static可修饰局部变量、全局变量、自定义函数。
二、static的具体用法
1、static修饰局部变量
从刚开始我们引入的两个例子可以发现,例2中static修饰了局部变量。而修饰局部变量有什么意义呢?首先我们先来了解一下局部变量、静态变量等在内存中所储存的位置。
我们都知道,局部变量进去作用域时创建,出了作用域就自动释放了。这也是例1打印出来10的一的原因。但是当static修饰局部变量时,例2中的局部变量a就变成了静态变量,放在了静态区。放在静态区的数据创建后直到整个程序结束才释放。例2中当第一次调用完test函数后,第二次调用时,a此时的值为1,同时不会执行static int =0语句,而是直接执行a++语句。
总结:
static修饰局部变量,局部变量变成静态变量,从而放在静态区。静态区的变量从创建后直到整个程序结束之后才释放。
通俗来讲,static修饰局部变量是改变了局部变量的生命周期,使其生命周期变长。
本质来讲,static修饰局部变量是改变了局部变量的储存位置。
注意static修饰局部变量,是改变了局部变量的生命周期,而不是作用域。
2、static修饰全局变量
全局变量本身就具有的属性是外部链接属性。在不同的源文件中,要引用其他源文件的全局变量,只需要用extern关键字就行。但是当我们用static修饰全局变量后,在另一个源文件中引用时就会发现找不到外部符号,也就是不能再引用。如下图:
总结:
- static修饰全局变量,使全局变量不在有外部连接属性。
- 通俗来讲,static修饰全局变量后,使全局变量只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。
- static修饰全局变量使其作用域变小。
3、static修饰函数
函数本身也是具有外部链接属性的。 在不同的源文件中,可以通过extern来引用其他源文件的函数。但是当static修饰函数时,其他源文件就不能过再引用。也就是使函数的外部链接属性变成了內部链接属性。
总结:
- static修饰函数,使函数不在有外部连接属性。
- 通俗来讲,static修饰函数后,使函数只能在自己所在的源文件中使用,不能被其他源文件通过extern链接使用。
结尾
综上我们可以看出,static的作用还是挺大的。static修饰局部变量、全局变量、自定义函数时意义分别也是不同的。但是修饰全局变量、自定义函数时较为相似。
希望以上内容对你有所帮助,感谢阅读。