C语言 --- static 的3个主要作用

以下内容, 根据  https://www.cnblogs.com/liuna/p/7238239.html(作者:辣牛),  及网上搜集的资料作整理. 

static, 3个主要作用: 限制作用域,  保持局部变量生命周期,  局部变量自动赋0

(1)作用域 :  可以理解为: private, 隐藏

在函数外声明的变量, 是全局变量, 其它文件中用 extern 再次定义, 就可以引用及修改变量.

函数, 也是全局变量, 其它文件也可以引用。

下面举例说明,  两个源文件,a.c 和 main.c。

下面是 a.c

char a = 'A';            // 函数外声明的变量, 是全局变量
void msg() 
{
    printf("Hello\n"); 
}

 下面是 main.c

int main(void)
{    
    extern char a;    // 用 extern 作定义前辍, 就可以引用 a.c 文件的变量
    printf("%c ", a);
    (void)msg();      // 引用 a.c 中的函数
    return 0;
}

程序的运行结果是:

A Hello

为什么在a.c中定义的全局变量, a , 和函数msg能在main.c中使用?

所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。

此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏, 防止其它文件访问, 更常用于不必费心 命名冲突。

 

(2) 保持局部变量生命周期至程序线束

static 修饰 的局部变量, 存储在静态存储区, 生命周期至整个程序结束, 像全局变量一样, 但作用域还限于所声明函数内;

static 修饰 的局部变量, 声明时必须初始化(会被分配存储地址),若不初始化,编译器就会自动赋值为0;

static 修饰 的局部变量, 只被初始化一次, 以后调用这条语句, 不执行, 保持变量最后的存储值.  这个特性很常用。

void staticLocalVar()
{
    static int a = 0; //运行期间初始化一次,第二次调用时不在进行初始化工作
    printf("%d", a);
    a++;
}

int main()
{
    staticLocalVar(); // 第一次调用,输出 a = 0
    staticLocalVar(); // 第二次调用,输出 a = 1
    return 0;
}

     

( 3)局部变量自动赋值0

static 修饰的 局部变量, 在声明时, 如果没赋值 , 就会自动赋值0;

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。

在静态数据区,内存中所有的字节默认值都是0x00;

这个很省工, 最常用的如: 字符串处理. 每次在字符数组末尾加’\0’太麻烦了。如果把字符串定义成静态的, 哈~

int a;

int main(void)
{
    int i;
    static char str[10];
    printf("integer: %d;  string: (begin)%s(end)", a, str);

    return 0;
}

程序的运行结果如下

integer: 0; string: (begin)(end)

本文线束 ~~~

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值