C语言--static标识的静态变量

变量的存储方式

  • 先来说一下变量存储的方式。变量的存储方式主要分两种:静态存储方式动态存储方式
  • 静态存储方式是指程序运行期间由系统分配固定的存储空间,这段存储空间会一直到程序执行结束时有系统释放。
  • 动态存储需要根据需要进行动态分配存储空间的方式。也就是用时系统就给分配内存,不用就会被释放。
  • static修饰的作用域有两个:1.文件作用域;2.函数作用域

一、文件作用域

1.修饰全局变量

  • 有时在函数外部定义了全局变量,但是不想让本文件外的其他函数引用就将其限制为静态全局变量。即在定义全局变量时在前面加上static修饰,这样就将变量的作用域限定到本文件内,其他文件不得引用,即使加extern关键字。

2.修饰函数

  • static用来修饰函数,是为了限定函数的作用域在此文件内。其他文件不能调用。加extern申明也无法调用。
  • 这样做有一个好处:在多文件编程中,有时会出现同名的函数,或者变量名从而引起编译器在编译的时候报重复定义的问题,就会使用static修饰函数或者全局变量,将他们的作用域限定在本作用域内,从而很好的解决了其重名的问题。
  • 在Linux内核驱动中会经常使用到用static修饰的函数,也是利用了这一特性。
  • 但是,凡事有利必有弊。这样的话也限制了函数或者全局变量的作用空间,所以后来在C++中为了解决此问题就提出了命名空间(namespace)的概念,用于区分同名函数或者变量。

二、函数作用域

1.静态局部变量

  • 这个一般是在函数中定义的,有时候希望在函数调用结束后局部变量的值不消失而继续保留原值,即占用的存储单元不释放,在下一次再调用该函数时,该变量已有值,即上次调用结束时的值
  • 究其原因,是因为,普通局部变量在栈区分配,属于自动变量,其赋值是在程序调用的时候。经static修饰的局部变量是在编译时赋初值的(前面提到的静态存储方式),其被存储在内存中的data段(初始化过)或者bss段(未初始化过)。而这两个段在程序编译的时候就已经存在,程序运行的时候,static修饰的局部变量的值就已经放在那里,每次需要的时候直接取就可以。(注意:static修饰的静态局部变量只初始化一次)
  • 补充:我们写的源代码要想成为可执行文件必须经过四个步骤,即:预处理、编译、汇编、链接这四个过程。
  • 重点静态局部变量并不是每次调用函数都会从新赋初值,它只会被赋初值一次,后再用时并不会再次赋初值,而是保留上次调用结束时的值。因为静态局部变量是在编译时赋初值,而动态变量是是调用时赋初值的。
    虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用他的。因为他是局部变量,所以也只能被本函数引用。

3.总结

  • 按变量的作用域分,可分为文本域和函数域,在全局变量中使用static标识,其目的是将变量的作用域限制在本文件内,其他文件不可使用。但若是在局部变量用static标识则表示其为静态局部变量,每次调用函数结束后其值不释放,仍保留上一次调用结束时的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值