static(静态关键字) 修饰变量和函数
静态局部变量:当函数第一次被调用时,函数中的静态局部变量被初始化,再次调用这个函数,这个static变量也不会再次被初始化,仍是保存的前一次函数调用时的结果(作用域不变,生存期改变)
什么意思呢?
void fun()
{
int a = 0;
int b = 0;
a += 1;
b += 1;
printf("a = %d b = %d\n", a, b);
}
int main()
{
int n = 5;
for (int i = 0; i < n; i++)
{
fun();
}
return 0;
}
输出结果为:
在加上static后
void fun()
{
int a = 0;
static int b = 0; //加了static
a += 1;
b += 1;
printf("a = %d b = %d\n", a, b);
}
int main()
{
int n = 5;
for (int i = 0; i < n; i++)
{
fun();
}
return 0;
}
输出结果为:
为什么会这样呢?
从主函数执行时,不会把栈全部分给主函数,而是把栈的一部分给主函数,这一部分空间大小就称为栈帧
i < n时,会调动fun函数,给fun函数也分配栈帧,当打印完a,b后又会回到主函数,给fun函数分配的栈帧会回收,a,b就相当于还给系统了
重新循环,调用fun函数,又会分配栈帧,然后重复这样
当函数被调用时,给形参分配空间,在栈区分配空间,而函数的代码在代码区,并不在栈区,而加static后
调用fun函数时,给a开辟空间,而static存放在数据区。因此b的值不会消失,而只在函数第一次调用时初始化
当程序被加载,代码放在代码区,全局变量会放到数据区,当函数被调用,给函数在栈区分配空间,调用完,空间回收,而当整个程序结束后,代码区、数据区、堆区、栈区统统消失。
因此加了static后,生存期变长而作用域不变
对于static的全局变量,当未给初始值时,默认为0
在c语言中无法把变量给静态局部变量
static int b = x; // 在这里编译不通过
void fun (static int x)
形参最好不要修饰为static
在创建时给值为初始化,而在定义后给值叫赋值
static对于全局变量或函数
全局变量:static 说明的全局变量只可以在当前c程序中使用(作用域受到限制,生存期不变)
函数:static说明的函数只可以在当前c程序文件中使用(作用域受到限制,生存期不变)
如果全局变量加了static,那么这个全局变量只能在本文件中使用,而不能在其他文件中使用
//test.c文件中
int g_max = 10; //还在.data区
void Print()
{
int x = 100;
g_max += 10;
printf("Print :: g_max %d\n", g_max);
}
//hello.c文件中
extern int g_max;
extern void Print();
int main()
{
int a = g_max;
Print();
return 0;
}
上面函数中加了静态关键字后,下面的文件中就不能引用g_max了
static void fun()
用static修饰fun函数,使fun函数只在该文件中使用,但生存期没有变,仍然在.data区
但如果加上const 也会导致全局变量只能在本文件中使用
const int max = 100;
如果你想让这个常变量在其他文件中使用,要加上extern
extern const int max = 100;