存储类别:auto/static/register/extern

     C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:动态存储期和静态存储期。

     在存储空间的位置分配为:1、程序区;2、静态存储区;3、动态存储区。

     静态存储方式程序运行期间系统分配固定存储空间,动态存储方式根据需求动态分配存储空间。

     auto和register对应动态存储区,具有动态存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。

     extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量只能被定义该变量的函数所识别,但是不同于自动变量的是,static变量在其函数被调用退出后,仍保留其值。下次函数被调用时,可以访问最近一次被修改后的值。

1、auto

         函数中未加static的局部变量和形参都属于此类,调用函数时分配内存,函数结束时释放内存。一般隐藏auto默认为自动存储类别。我们程序的变量大多是自动变量。

         注意:全局变量的存储类别是静态存储。

         Auto char c;

2、register

          动态和静态变量都是存放在内存中步骤如下:

          1、程序中遇到该值时,控制器首先发指令将变量的值送到运算器中;

          2、然后需要存数再保存到内存中。

          如果频繁使用一个变量,比如一个函数体内的多次循环每次都引用该局部变量,我们则可以把局部变量的值放到CPU的寄存器中,叫寄存器变量。不需要多次到内存中存取提高效率。但是只能局部自动变量和形参可以做寄存器变量。在函数调用时占用一些寄存器,函数结束时释放。不同系统对register要求也不一样,比如对定义register变量个数,数据类型等限制,有的默认为自动变量处理。所以在程序一般也不用。

          Register int d;

3、static

          局部变量:static声明的局部变量在函数调用结束后不释放存储空间,再次调用函数时该变量上次保存的值。其他函数时不能引用它的,只作用于本函数程序块内。Static局部变量时在编译赋初值,自动变量的初值是函数调用时赋的。所以局部变量不赋初始值的话static变量自动赋值0或在空字符。而自动变量的初值则是不确定的。最好不要直接使用。

          全局变量:全局变量只能在本文件内使用,而不能被其他文件引用,在全局变量定义的时候加static声明。可以做到防止别人写的模块误用。

          Static int a;

4、extern

          在函数外部定义的全局变量,作用域开始于变量定义,结束于程序文件的结束。我们可以extern来声明外部变量来扩展它的作用域。

          1、同一个文件内,extern声明之后就可以作用域扩大到声明处到文件结束。比如在一个函数之后定义外部变量a,之后的函数可以使用该变量,但是之前的函数不能使用,加extern可以解决。

          2、多个文件时,可以在未定义该外部变量的文件内做extern声明即可以使用。但是需要注意可能执行一个文件时改变了该全局变量的值,影响其他文件的调用。编译时遇到extern,会先在文件内找是否定义了该外部变量。如果未找到则在链接时在其他文件中找。

          还有一种方法,在 .c文件开头定义全局变量,然后在相对应的 .h文件里面进行extern该变量,其他文件引用该变量时,只需将对应的 .h文件名添加即可。

          Extern b;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值