C语言中的关键字:static
程序员文章站
2022-07-11 17:56:34
...
静态局部变量:static
static关键字有两个作用:修饰变量,修饰函数。现在我们只看他修饰变量的功能。
在引入static关键字之前,我们先来看一段代码
void fun(int a)
{
a += 10;
}
int add(int x, int y)
{
int c;
fun(x);
c = x + y;
return c;
}
int main()
{
int a = 10, b = 20;
int z = add(a, b);
return 0;
}
Z等于多少呢?40?30?
我们引入一个生存期的概念
生存期 (lifetime) :从对象分配到内存开始,到垃圾回收器从内存中删除对象结束这一段时间。即对象的存在时间。
在fun函数结束之后,函数所开辟的栈帧被释放,在fun函数中虽然 a值被改变,但是不会影响add函数中x的值。
所以有时候希望函数中的局部变量的值在函数调用结束之后不消失而时继续保留原值,即所占有的存储单元不被释放,在下一次在调用该函数时,该变量已有值。这时我们就应该指定该局部变量为“静态局部变量”,用关键字static进行声明。
static int j;
void fun1(void)
{
static int i = 0;
i++;
}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
for (int k = 0; k < 10; k++)
{
fun1();
fun2();
}
return 0;
}
这是陈正冲老师在《c语言深度剖析》中所引用的例子,那么i,j分别是多少呢?
在上述代码中,j是静态全局变量,i是静态局部变量。
静态局部变量:在函数体里面定义,作用域仅限于该函数中使用,他定义在内存中的数据区,所以函数运行结束,该变量不会被销毁,函数下次仍然可以使用到这个值,但其他函数不可以调用此值。其他函数要想调用此变量需要在前面加extern进行调用。
静态全局变量:作用域仅限于被定义的文件中,其他文件即使使用extern声明也没办法使用它,准确的说是从静态变量被定义之处开始,在定义之前想要定义也必须extern声明才可使用。