概述
static的汉语意思是静态的,在C语言中static关键字可以用来修饰局部变量、全局变量和函数。
在这里给大家补充一个知识,我们的数据在内存中存储时,大概分为3个区域。
1.栈区:我们创建的局部变量、形参等一般就存放在这个区域,离开作用域是会自动销毁,将空间还给操作系统。
2.堆区:堆区存储的数据一般是由我们程序员自己来开辟的,比如使用malloc、realloc等来动态开辟,这个区域的空间需要我们程序员自己释放,否则就会造成内存泄漏。
3.静态区:这里一般存储的是全局变量和静态变量,他是有操作系统创建的,工程结束后由操作系统回收。
static修饰局部变量
在讲这个之前我们先来比较两段代码:
#include<stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 5; i++) { test(); } return 0; }
运行结果为:
再来看下面这段代码:
#include<stdio.h> void test() { static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 5; i++) { test(); } return 0; }
运行结果为:
我们可以看到,这两段代码一个test函数中的i用了static关键字修饰,一个没有,造成运行结果有这么大的差异,这是为什么呢?
其实道理很简单,static来修饰局部变量,该变量就变成了静态变量,那么它就从原本的栈区改变到了静态区,它不会随着函数的结束而被销毁,因此我们就看到了下面的这个结果,我们在这里可以理解为static修饰局部变量延长了局部变量的生命周期。
在这里需要注意的是,static修饰的局部变量,在编译时已经创建了,并不是程序走到这个位置才创建的。
static修饰全局变量
全局变量具有外部链接属性,就是我们在一个工程中可以有多个.c文件,在别的文件中定义的全局变量是可以在我们本文件中使用的,我们在使用的时候只需要用exturn声明一下就可以使用。如:
我们是可以使用另一个.c文件中的全局变量的,但是如果static修饰了这个全局变量,就使它的外部链接属性变成了内部链接属性,这时我们只能在定义那个全局变量的文件中使用,在别的文件中就不能使用。
static修饰函数
static修饰函数和修饰全局变量非常相似,C语言中函数也是具有外部链接属性的,用static修饰后,也是使它的外部链接属性变成了内部链接属性,这是也只能在定义这个函数的.c文件中使用,在别的文件中无法使用。
今天的分享就到这里了,感谢大家的关注和支持!