C语言中变量的存储类别

91902649db48ed151c2d96c947484d09.png

点击上方蓝字关注我,了解更多咨询

9c024ba8cffdbd85dca686d40a619cbc.png

在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储。可以通过存储类修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto)、静态(static)、寄存器(register)和外部(extern)4种。

静态存储与动态存储

根据变量的产生时间,可将其分为静态存储和动态存储。

静态存储是指程序运行时为其分配固定的存储空间,动态存储则是在程序运行期间根据需要动态地分配存储空间。

auto变量

auto关键字用于定义一个局部变量为自动的,这意味着每次执行到定义该变量时,都会产生一个新的变量,并且对其重新进行初始化。

【例】 使用auto变量。

在AddOne函数中定义一个auto型的整型变量iInt,在其中对变量进行加1操作。之后在主函数main中通过显示的提示语句,可以看到调用两次AddOne函数的输出,从结果可以看到,在AddOne函数中定义整型变量时系统会为其分配内存空间,在函数调用结束时自动释放这些存储空间。

4011da24024338fc729dd06f932f4f43.png

95a43b77a57a01aebe71a87a536633da.png

注意:事实上,关键字auto是可以省略的,如果不特别指定,局部变量的存储方式默认为自动的。

static变量

static变量为静态变量,将函数的内部变量和外部变量声明成static变量的意义是不一样的。不过对于局部变量来说,static变量是和auto变量相对而言的。尽管两者的作用域都仅限于声明变量的函数之中,但是在语句块执行期间,static变量将始终保持它的值,并且初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值。

【例】 使用static变量。

在AddOne函数中定义一个static型的整型变量iInt,在其中对变量进行加1操作。之后在主函数main中通过显示的提示语句,可以看到调用两次AddOne函数的输出,从结果中可以发现static变量的值保持不变。

5f6e24bc230a619fd509475cecad5775.png

ad8708d2f7e31f9263c9ebb0331d2900.png

register变量

register变量称为寄存器存储类变量。通过register变量,程序员可以把某个局部变量指定存放在计算机的某个硬件寄存器中,而不是内存中。这样做的好处是可以提高程序的运行速度。不过,这只是反映了程序员的主观意愿,实际上,编辑器可以忽略register对变量的修饰。

用户无法获得寄存器变量的地址,因为绝大多数计算机的硬件寄存器都不占用内存地址。而且,即使编译器忽略register,而把变量存放在可设定的内存中,也是无法获取变量的地址的。

如果想有效地利用寄存器register关键字,必须像汇编语言程序员那样了解处理器的内部结构,知道可用于存放变量的寄存器的数量、种类以及工作方式。但是,不同计算机对于这些细节可能是不同的,因此,对于一个具备可移植性的程序来说,register的作用并不大。

下面通过一个实例来介绍寄存器变量的使用方法。

【例】 使用register变量修饰整型变量。

a85b2180381e3cd033c44defd2bd8ed8.png

47b75c31cff3bc1061bbe49e38fa0670.png

extern变量

extern变量称为外部存储变量。extern声明了程序中将要用到但尚未定义的外部变量。通常,外部存储类都用于声明在另一个转换单元中定义的变量。

一个工程是由多个C文件组成的。这些源代码文件会分别进行编译,然后链接成一个可执行模块。把这样的一个程序作为一个工程进行管理,并且生成一个工程文件来记录所包含的所有源代码文件。

下面通过一个实例来具体了解一下extern变量。

【例】 使用extern变量。

在本实例中,首先在Extern1文件中定义一个外部整型iExtern变量,然后在Extern2文件中使用iExtern变量,并为其进行赋值,将其变量值显示到控制台。

92bb2d1f6da37ef9231cb668ee45528f.png

运行程序,显示效果如图所示。

b413cd7142ab54c481399d6a7e67bf3e.png

206f141b1d4b0090a4bb922b05d91e94.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

ee6b6ef40f4da080293263b93ad591de.png

514356c2a2763e93e1adfce4289352cc.gif

戳“阅读原文”我们一起进步

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值