点击上方蓝字关注我,了解更多咨询
在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储。可以通过存储类修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto)、静态(static)、寄存器(register)和外部(extern)4种。
静态存储与动态存储
根据变量的产生时间,可将其分为静态存储和动态存储。
静态存储是指程序运行时为其分配固定的存储空间,动态存储则是在程序运行期间根据需要动态地分配存储空间。
auto变量
auto关键字用于定义一个局部变量为自动的,这意味着每次执行到定义该变量时,都会产生一个新的变量,并且对其重新进行初始化。
【例】 使用auto变量。
在AddOne函数中定义一个auto型的整型变量iInt,在其中对变量进行加1操作。之后在主函数main中通过显示的提示语句,可以看到调用两次AddOne函数的输出,从结果可以看到,在AddOne函数中定义整型变量时系统会为其分配内存空间,在函数调用结束时自动释放这些存储空间。
注意:事实上,关键字auto是可以省略的,如果不特别指定,局部变量的存储方式默认为自动的。
static变量
static变量为静态变量,将函数的内部变量和外部变量声明成static变量的意义是不一样的。不过对于局部变量来说,static变量是和auto变量相对而言的。尽管两者的作用域都仅限于声明变量的函数之中,但是在语句块执行期间,static变量将始终保持它的值,并且初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值。
【例】 使用static变量。
在AddOne函数中定义一个static型的整型变量iInt,在其中对变量进行加1操作。之后在主函数main中通过显示的提示语句,可以看到调用两次AddOne函数的输出,从结果中可以发现static变量的值保持不变。
register变量
register变量称为寄存器存储类变量。通过register变量,程序员可以把某个局部变量指定存放在计算机的某个硬件寄存器中,而不是内存中。这样做的好处是可以提高程序的运行速度。不过,这只是反映了程序员的主观意愿,实际上,编辑器可以忽略register对变量的修饰。
用户无法获得寄存器变量的地址,因为绝大多数计算机的硬件寄存器都不占用内存地址。而且,即使编译器忽略register,而把变量存放在可设定的内存中,也是无法获取变量的地址的。
如果想有效地利用寄存器register关键字,必须像汇编语言程序员那样了解处理器的内部结构,知道可用于存放变量的寄存器的数量、种类以及工作方式。但是,不同计算机对于这些细节可能是不同的,因此,对于一个具备可移植性的程序来说,register的作用并不大。
下面通过一个实例来介绍寄存器变量的使用方法。
【例】 使用register变量修饰整型变量。
extern变量
extern变量称为外部存储变量。extern声明了程序中将要用到但尚未定义的外部变量。通常,外部存储类都用于声明在另一个转换单元中定义的变量。
一个工程是由多个C文件组成的。这些源代码文件会分别进行编译,然后链接成一个可执行模块。把这样的一个程序作为一个工程进行管理,并且生成一个工程文件来记录所包含的所有源代码文件。
下面通过一个实例来具体了解一下extern变量。
【例】 使用extern变量。
在本实例中,首先在Extern1文件中定义一个外部整型iExtern变量,然后在Extern2文件中使用iExtern变量,并为其进行赋值,将其变量值显示到控制台。
运行程序,显示效果如图所示。
END
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
戳“阅读原文”我们一起进步