static作用:
1、修饰变量:
a)改变作用域,对全局变量来说,static修饰的变量作用域为从定义之处开始,到文件结尾处结束;别的源文件中不能引用该变量,即使用extern也不行;本文件内,定义之前也不能使用,除非用extern声明;对局部变量来说,只能作用在函数内部,在这一点上来说和普通的局部变量一致;
b)存储方式,对全局变量来说,全局变量原本就存储在静态区域,在这一点上来说和普通全局变量一致;对局部变量来说,普通的局部变量定义在动态区(与关键字auto对应),在函数执行完后,普通的局部变量被释放;而静态局部变量,被定义在静态区,函数执行完之后,该静态变量仍然储存在静态区,不会被释放和销毁,函数被下次调用时仍然用到这个值。
static int j;
void fun1(void)
{
static int i=0;
i++;
}
void fun2(void)
{
j=0;
j++;
}
void main()
{
int k=0;
for(k=0;k<10;k++)
{
fun1();
fun2();
}
}
static int i=0; //声明,并初始化,只在函数第一次被调用时执行;下一次的调用不会重新初始化,因为i变量已经在内存的静态区,只需要依据上一次的值改变/即可,所以在main函数中调用10次之后,i的值为10。如果去掉static,那么每次执行完函数之后,i都不释放,那么下次调用函数时需要重新声明并初始化。
j=0; //全局的静态变量,此处不是初始化,而是赋值,所以在每次调用这个函数,都执行这一步,main函数调用十次,每次都赋值为0
2、修饰函数:
函数前面加static,是函数称为静态函数,此时static的含义并不是指存储方式,而是指函数的作用域仅限于本文件,所以又称为内部函数。
另外一点不同就是static函数在执行时并不是拷贝一份,而是直接执行。