以下内容, 根据 https://www.cnblogs.com/liuna/p/7238239.html(作者:辣牛), 及网上搜集的资料作整理.
static, 3个主要作用: 限制作用域, 保持局部变量生命周期, 局部变量自动赋0
(1)作用域 : 可以理解为: private, 隐藏
在函数外声明的变量, 是全局变量, 其它文件中用 extern 再次定义, 就可以引用及修改变量.
函数, 也是全局变量, 其它文件也可以引用。
下面举例说明, 两个源文件,a.c 和 main.c。
下面是 a.c
char a = 'A'; // 函数外声明的变量, 是全局变量
void msg()
{
printf("Hello\n");
}
下面是 main.c
int main(void)
{
extern char a; // 用 extern 作定义前辍, 就可以引用 a.c 文件的变量
printf("%c ", a);
(void)msg(); // 引用 a.c 中的函数
return 0;
}
程序的运行结果是:
A Hello
为什么在a.c中定义的全局变量, a , 和函数msg能在main.c中使用?
所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。
此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏, 防止其它文件访问, 更常用于不必费心 命名冲突。
(2) 保持局部变量生命周期至程序线束
static 修饰 的局部变量, 存储在静态存储区, 生命周期至整个程序结束, 像全局变量一样, 但作用域还限于所声明函数内;
static 修饰 的局部变量, 声明时必须初始化(会被分配存储地址),若不初始化,编译器就会自动赋值为0;
static 修饰 的局部变量, 只被初始化一次, 以后调用这条语句, 不执行, 保持变量最后的存储值. 这个特性很常用。
void staticLocalVar()
{
static int a = 0; //运行期间初始化一次,第二次调用时不在进行初始化工作
printf("%d", a);
a++;
}
int main()
{
staticLocalVar(); // 第一次调用,输出 a = 0
staticLocalVar(); // 第二次调用,输出 a = 1
return 0;
}
( 3)局部变量自动赋值0
static 修饰的 局部变量, 在声明时, 如果没赋值 , 就会自动赋值0;
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00;
这个很省工, 最常用的如: 字符串处理. 每次在字符数组末尾加’\0’太麻烦了。如果把字符串定义成静态的, 哈~
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
程序的运行结果如下
integer: 0; string: (begin)(end)
本文线束 ~~~