static函数修饰全局变量和局部变量

static int a=1;

void fun1(void){    a=2;  }

void fun2(void){    int a=3;  }

void fun3(void){   static int a=4;  }

int main(int argc,char** args){ 

     printf(“%d”,a); 

     fun1( ); 

     printf(“%d”,a); 

     fun2( ); 

     printf(“%d”,a);

     fun3( );

      printf(“%d”,a); 

}

结果是:

1 2 2 2

对于static修饰全局变量,最主要的作用就是限定了这个全局变量的作用范围,不可以被其他类,其他文件引用。

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 

但是static修饰局部变量的话,将其放到全局区,也就是静态区,当一个函数里面有一个static修饰的局部变量的时候,如果反复调用多次,那么下一次函数用的该变量的值不会再被初始化一次了,而是采用上一次函数执行完之后此变量的值。所以,说明:1.static修饰的变量的值是可变的2.只是在此函数的调用中为全局变量。

且需要注意的是,静态局部变量只对定义它的函数体始终可见,函数体执行完过后虽然还存在,但是无法被其他的使用了

就是说明,在该函数的调用过程中,这个变量作为全局变量可以被使用。且不随着函数结束释放掉,整个程序结束的时候才被释放掉,但是不被其他的函数所引用。跟真正的全局变量还是有区别的。真正的全局变量是所有的函数都可以访问到。

static修饰局部变量

普通的局部变量是在栈上进行分配的,局部变量所处的函数被多次调用时每次调用的位置都不一样的。局部变量也可以在堆上进行动态的分配,但须记得释放空间。 
静态局部变量和普通局部变量区别如下: 
访问权限:静态局部变量只能被其作用域内的变量和函数进行访问使用,它虽然存在与程序的整个生命周期,但由于是static的所以不能被其他函数和源文件访问。 相当于只是该函数内的全局变量。
作用位置:静态局部变量被编译器存放在全局存储区(data),所以它虽然是局部的但是却存在与整个生命周期。 
值:静态的局部变量如果没有被初始化,会自动被编译器赋值为0,以后每次调用静态局部变量就都会用上次调用的值(每次函数调用静态局部变量都修改它然后离开,下次读的时候从全局存储区读的静态局部变量就是上次修改后的值)。 
注意: 
由于函数的每次调用,普通的局部变量都会重新分配,而静态局部变量会保持上次调用的值不变。正是由于static局部变量的这种特性,使得静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果,这在多线程编程时可能会成为一种隐患。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值