C语言关于static的解析
#include<stdio.h>
static int j;
void fun1(void)
{
int i = 0;
i ++;
}
void fun2(void)
{
j = 0;
j++;
}
int main()
{
for(int k=0; k<10; k++)
{
fun1();
fun2();
}
getchar();
return 0;
}
结果:i=10;j=1;
在C语言中,static关键字有三种用途:
1 用于全局变量定义时。
全局变量定义时加上static修饰,表示该变量为静态全局变量。作用域为当前文件。
2 用于函数定义或声明。
任意函数的定义或声明中包含了static修饰,表示该函数为静态函数,只能在本文件中被调用。
3 用于局部变量定义。
局部变量定义时,带有static关键字,表示其为静态局部变量,只被初始化一次,之后每次调用函数时,该变量值为上次函数退出时的值。即,改变量的生存周期被扩展到整个程序运行时间段内。
定义并初始化和定义之后再赋值,有区别的:
static int i = 0;//定义变量并初始化,只执行一次赋值
static int j;
j=0; //赋值语句,每次都执行
static int i = 0;这个只是定义和初始化,由于是static的,所以第一次执行到这里时,回去定义和初始化,但是之后再到这里时,发现已经定义过了,所以不会再定义,这样也就不会初始化。这个是static的运行机制。
Static在c语言里面有两个作用,第一个是修饰变量,第二个是修饰函数。
1、Static修饰变量
按照作用范围的不同,变量分为局部变量和全局变量。如果用static修饰变量,不论这个变量是全局的还是局部的都是存储在静态数据区。下面分开来讲:
¨ 如果用static修饰全局变量,我们称其为静态全局变量。
我们用static修饰全局变量的主要目的就是:使得其作用域仅限于变量被定义的文件中(即从变量定义处到本文件结尾处),其它文件不论通过什么方式都不能访问。
¨ 如果用static修饰局部变量,我们称其为静态局部变量。
我们用static修饰局部变量的目的主要有两个:
1) 在某个函数体里面定义的静态局部变量,只能在本函数体被访问,即使同一个文件的其它函数也访问不了。
2) 静态局部变量总存储在静态数据区,所以即使这个函数运行结束,这个静态局部变量的值不会被销毁,函数下次使用时仍然要用到这个值。
下面给出一个例程:
#include <stdio.h>
static int j; // 静态全局变量
int fun1(void)
{
static int i = 0;
i++;
return i;
}
int fun2(void)
{
j = 0;
j++;
return j;
}
int main(int argc, char *argv[])
{
int k = 0, m = 0, n = 0;
for(k=0; k<10; k++){
m = fun1( );
n = fun2( );
printf("%d,%d\n", m, n);
}
return 0;
}
结果:
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1
10,1
从例程的运行结果可以看出:
对于fun1( ),运行一次之后,变量i保持了原来的数据,并没有销毁,而是在下一次调用的时候继续使用,所以才会有1、2、3…10这样的结果。而对于fun2( ),运行一次之后,变量j的值被销毁了,所以第二次调用结束j仍然保持原值“1”,所以循环十次,每次都是1
2、Static修饰函数
在函数前加static,则此函数成为静态函数(内部函数),我们用static修饰函数的主要目的是:用来表示不能被其它文件访问的一个函数(和用static修饰全局变量的目的一样,都是不允许其它文件访问)。这样一来便有一个好处:程序员不用担心自己编写的函数与其他文件的函数同名。