生存期和存储类型

  1. 生存期
    C语言变量拥有两种生存期,分别是静态存储期(static storage duration)和自动存储期(automatic storage duration)。

     具有文件作用域的变量具有静态存储期(比如全局变量),函数名也具有静态存储期。具有静态存储期的变量在程序执行期间将一直占据存储空间,直到程序关闭才释放;具有代码块作用域的变量一般情况下具有自动存储期(比如局部变量和形式参数),具有自动存储期的变量在代码块结束时将自动释放存储空间。
    
  2. 存储类型
    前边我们分别介绍了C语言变量的作用域、连接属性和生存期,总得来说,这些都是由变量的存储类型来定义的。变量的存储类型其实是指存储变量值的内存类型,C语言提供了5种不同的存储类型,分别是:auto、register、static、extern 还有typedef。

  3. 自动变量(auto)
    在代码块中声明的变量默认的存储类型就是自动变量,使用auto关键字来描述。所以函数中的形参、局部变量,包括复合语句的定义局部变量都具有自动变量属性。自动变量拥有代码块作用域,自动存储期和空链接属性

  4. 寄存器变量(register)
    寄存器是存在于CPU的内部的,CPU对寄存器的读取和存储可以说是没有任何延迟的。

     将一个变量声明为寄存器变量,那么该变量可能被存放于CPU的寄存器中。因为CPU的空间是十分有限,所以编译器并不会让你将所有声明为register变量都放到寄存器中。事实上,有可能所有的register关键字都忽略,因为编译器有自己的一套优化方法,会权衡哪些才是最常用的变量。在编译器看来它觉得它比你更了解程序。被忽略的register变量,会成为普通的自动变量。
    
     所以寄存器变量和自动变量很多方面是一样的, **他们都拥有代码块作用域,自动存储期和空链接属性**
    
  5. 静态局部变量
    static用于描述文件作用域的变量和函数时候,表示将其链接属性重external修改为internal,它的作用范围就是仅当前源文件可以访问。

     但是如果将static描述局部变量,那么效果就会不一样。默认情况下,局部变量是auto存储类型,如果使用static来声明,那么就可以将局部变量指定为静态局部变量。static使得局部变量具有静态存储期。所以他的生存期与全局变量一样,直到程序结束才释放。
     **注意只改变了生存期,没有改变作用域**。
    
  6. static和extern
    作用于文件作用域的static和extern,extern关键字是用于告诉编译器,这个函数或变量在别的地方定义过的,先去别的地方找,不要报错。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值