static关键字可以修饰:局部变量、全局变量、函数、成员变量、成员函数
1.修饰局部变量
局部变量就是在函数内定义的变量,普通的局部变量,生存周期是随着函数的结束而结束,每次函数重新执行,局部变量都是新的值,不会保留上次的值。当用static修饰后,局部变量的生存周期就是当程序结束才会结束。再次调用函数时,用static修饰的变量会保留上一次的值。
应用:在函数内,我们想保留某些变量上一次的值,就可以用static去修饰该变量。比如:想统计该函数被执行的次数时,就可以定义被static修饰的int型变量,每执行一次该变量就++。
总结:用static修饰的局部变量,改变了生存周期,但是没有改变其作用域。改变其生存周期的原因是被static修饰的局部变量被存放在.bss段或者.data段,而普通的局部变量是存放在栈上的。
当局部变量 var 不用 static 修饰时:
#include <stdio.h>
int fun()
{
int var = 0;
var += 1;
return var;
}
int main(int argc, char **argv)
{
for (int i = 0; i < 5; i++)
printf("%d ", fun());
printf("\n");
return 0;
}
代码运行结果如下:
1 1 1 1 1
当局部变量 var 使用 static 修饰时:
#include <stdio.h>
int fun()
{
// int var = 0;
static int var = 0;
var += 1;
return var;
}
int main(int argc, char **argv)
{
for (int i = 0; i < 5; i++)
printf("%d ", fun());
printf("\n");
return 0;
}
代码运行结果如下:
1 2 3 4 5
2.修饰全局变量
全局变量用static修饰改变了作用域,没有改变生存周期。普通的全局变量是可以被其他的.c文件引用的,一旦被static修饰,就只能被定义该全局变量的.c文件引用,使得该全局变量的作用范围减小。
作用:当一个全局变量不想被其他.c文件引用时,可以用static修饰,这样其他的文件就不能通过extern的方式去访问,这样主要是为了数据安全。
总结:改变其作用域,没有改变生存周期。
3.修饰函数
函数用static修饰,改变了作用域。普通的函数是可以通过头文件声明的方式被其他文件调用,被static修饰后就只能在本文件里被调用,这样是为了数据的安全。
作用:有些函数并不想对外提供,只需要在本文件里调用,这时候就可以用static去修饰。
总结:改变了作用域,没有改变其生存周期。
用static修饰全局变量和函数,除了上面说的数据安全,防止被误引用,还有一个作用是解决重名问题。当用static修饰了全局变量和函数后,其他文件里再定义同名的全局变量和函数也是可以的。一般来说,如果不是要对外提供的函数和全局变量,最好都用static修饰。
4.修饰成员变量或成员函数