C语言中static对于变量的作用

一、static修饰全局变量:

当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。根据这个原理,我们可以在多个文件中定义相同名字的全局变量而不影响,可以重名。

#include "file1.h"  
  
static char* hello = "hello CSDN!";  
  
void printStr()  
{  
    printf("%s\n", hello);  
}  //输出hello CSDN
#include "file1.h"  
int main()  
{  
    printStr();  
    printf("%s\n", hello);  
    return 0;  
}  //报错hello未定义

在文件file1中定义的静态全局变量,在file2文件中调用会报错

file2.c:5: 错误:‘hello’ 未声明 (在此函数内第一次使用)
file2.c:5: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其所在的函数内只报告一次。)

二、static修饰局部变量:

  static局部变量中文名叫静态局部变量

           1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在

           2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

           3):静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。

#include "file1.h"  
  
void printStr()  
{  
    int normal_val = 0;  
    static int static_val = 0;    
    printf("normal_val = %d\n",normal_val);  
    printf("static_val = %d\n",static_val")
    normal_val++;  
    static_val++;  
}  
#include "file1.h"  
int main()  
{  
 printStr();  
 printStr();  
 printStr();  
 return 0;
}

输出结果:

normal_val = 0
static_val = 0
normal_val = 0
static_val = 1
normal_val = 0
static_val = 2


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值