static 关键字
在c语言中,static关键字可以修饰变量,也可以修饰函数
●修饰变量:
变量分为全局变量和局部变量。全局变量在内存的静态区,局部变量在内存的堆栈区。所以static修饰的变量又分为:静态全局变量和静态局部变量。
⊙静态全局变量:
静态全局变量,作用域仅限于变量被定义的文件之中,在外部文件中,即使使用extern声明,也无使用之。
另外,对于全局变量(包括静态全局和普通全局)所在的文件中,如果希望在全局变量定义之前的位置使用之,亦要通过extern声明。
★如下代码:
…
extern int a; //这里就是一个声明语句,而非定义语句(具体见note1)。
void fun3()
{
printf("a is %d\n",a);
}
static int a=10;//注意:静态全局变量a,定义在fun3函数后面。
//fun3函数若想使用全局变量a,必须在之前使用extern声明一下。
…
⊙静态局部变量:
静态局部变量,定义在函数体内部的静态变量。只有该函数能够访问此变量,同一个文档的其他函数都无法访问之。
同时,静态局部变量在内存的静态区(这一点不同于普通局部变量),所以当函数体运行结束后,此静态变量的值不会被销毁,下一次执行该函数时仍可以用到上一次结束时的值。
★如下代码:
void fun1(void)
{
static int i=0; //在第二次执行fun1函数的时候,编译器发现变量i已经存在静态区,那么什么也做。不会对i再赋值为0
i++; //这样每执行一次,i的值都被加1,且得以保存
printf("i is %d\n",i);
}
int main()
{
int k;
for(k=0;k<10;k++)
fun1();
}
函数执行的结果:
i=1
i=2
…
i=10
★如果把上面的代码改为如下:
void fun1(void)
{
static int i; //第二次执行的时候,编译器发现i已经在内存中,那么什么也不做。
i=0; //把i的值修改为0。这样每执行一次,i的值都被清0,所以结果与上面有所不同
i++;
printf("i is %d\n",i);
}
int main()
{
int k;
for(k=0;k<10;k++)
fun1();
}
函数执行的结果:
i=1
i=1
…
i=1
●修饰函数:
静态函数,作用域仅限于本文件中。
这样做的好处:在一个项目中,涉及到多个文件,大家分别开发,可能会出现各自定义的函数名冲突。如果使用静态函数,那么不必担心自己定义的函数会和其他文件中的函数重名。