注意,这里只讨论静态全局变量和全局变量,不涉及静态局部变量和局部变量。
在c语言的开发工作中,我们可能会遇到,需要某个变量,但是这个变量只能在当前源文件中具有全局性,而对于源程序的其他源文件来说不可引用。想想如何定义呢?我们可能一下就想到了全局变量,但仔细一想,它过于满足要求了,对于源程序的其他源文件都是可用的。好吧,再搜索一下知识库,在全局变量前加个关键字static呢?静态全局变量,哈哈,正好满足!
需要我们搞清楚静态全局变量和全局变量之间的相同点与不同点。
我们先看一下这两者之间的相同点:
- 存储方式:全局变量和静态全局变量,都采用的是静态存储方式。
不同点:
- 作用域:全局变量,整个源程序的所有源文件。静态全局变量,仅在定义该变量的源文件内可使用,而在同一源程序的其他源文件中不可被引用使用。
小结,
静态全局变量相对于全局变量而言,在整个源程序中,对非定义此静态全局变量的源文件具有隐藏与隔离的作用,所以,可以在c语言有模块化程序设计需求的开发中使用。
注意,下面只讨论静态局部变量和局部变量,不涉及静态全局变量和全局变量。
上面聊的好像过于少了,那就顺便聊一下静态局部变量吧。
什么是静态局部变量呢?
简单的说,如果你明白局部变量的定义,那么将局部变量前再加一个关键字 static ,这个局部变量就变成静态局部变量了。
将关键字 static 加之于局部变量之上后,该局部变量的存储位置就发生了质的变化,从在栈中存放改变为在静态存储区存放了。在 c 语言程序中,静态局部变量是在编译时赋初值的,且只赋初值一次,在程序运行时它已有初值(如果不指定初始值,则默认初始值为0)。如若在函数中定义了静态局部变量,此静态局部变量在编译时被赋初始值,程序运行时它已有初值,运行后在每次调用函数时不会再被重新赋初值,而是保留上次函数调用结束时的值。
对于函数中定义的局部变量,每调用一次函数,函数中的局部变量就会被重新初始化一次。
通过上面的描述,静态局部变量一般的使用场景就很明确了。
再说一下可见性,相对于局部变量,其可见性并不会发生变化,仍旧只在其被声明的代码块中是可见。