3.4 变量的存储类型
存储类定义C语言程序中变量或函数的范围(可见性)和生命周期,这些说明符放置在它们所修饰的类型之前。在C语言程序中,可以通过存储类修饰符来告诉编译器要处理什么样的类型变量,具体有以下4种:自动型(auto)、静态型(static)、寄存器型(register)和外部型(extern)。
3.4.1 自动型变量
自动型(auto)变量是所有局部变量默认的存储类型。在变量前添加auto关键字,是声明该局部变量为自动的,这就意味着每次执行到定义该变量的时候,都会产生一个新的变量,并且对其重新进行初始化,另外,auto只能用在函数内,即auto只能修饰局部变量。
例如:
该语句中,a是形参,b、c是自动变量,对c赋初值100。执行完函数f()后,自动释放a、b、c所占的存储单元。
☆大牛提醒☆
关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。
【例3.11】编写程序,定义自动型变量,通过多次调用函数输出运行结果(源代码\ch03\3.11.txt)。
图3-12 例3.11的程序运行结果
程序运行结果如图3-12所示。
在本实例中,首先在函数fun()中定义一个自动型的整型变量add,在其中对变量进行加1操作。之后在主函数main()中通过显示的提示语句,可以看到调用2次函数fun()并输出,从结果中可以看到函数fun()中定义整型变量时系统会为其分配内存空间,在函数调用结束时自动释放这些存储空间。
3.4.2 静态型变量
静态型(static)变量指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰符修饰局部变量可以在函数调用之间保持局部变量的值。
static修饰符也可以应用于全局变量,当static修饰符修饰全局变量时,会使变量的作用域限制在声明它的文件内。全局声明的一个静态型变量或方法可以被任何函数或方法调用,只要这些方法出现在跟静态型变量或方法同一个文件中。
【例3.12】编写程序,定义静态型变量,通过多次调用函数输出运行结果(源代码\ch03\3.12.txt)。
图3-13 例3.12的程序运行结果
程序运行结果如图3-13所示。
在本实例中,使用了静态型变量。首先在函数fun()中定义一个静态型的整型变量add,在其中对变量进行加1操作。之后在主函数main()中通过显示的提示语句,可以看到调用2次函数fun()并输出,从结果中可以发现静态变量的值保持不变,因此2次调用的结果不一样。
3.4.3 寄存器型变量
寄存器型(register)变量用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元'&'运算符,因为它没有内存位置,这样的好处是可以提高程序的运行速度。语法格式如下:
{ register int miles; }
☆大牛提醒☆
寄存器只用于需要快速访问的变量,比如计数器。另外,定义register并不意味着变量将被存储在寄存器中,而是意味着变量可能存储在寄存器中,这取决于硬件的限制。
【例3.13】编写程序,定义寄存器型变量来修饰整型变量,最后输出运行结果(源代码\ch03\3.13.txt)。
图3-14 例3.13的程序运行结果
程序运行结果如图3-14所示。
3.4.4 外部型变量
外部型(extern)变量用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当用户使用外部型变量时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。extern修饰符通常用于两个或多个文件共享相同的全局变量或函数的时候。
【例3.14】编写程序,定义外部型变量,调用两个文件中共享的数值,并输出运行结果(源代码\ch03\3.14.txt)。
程序运行结果如图3-15所示。
图3-15 例3.14的程序运行结果
在本实例中,使用了外部型变量。首先在Extern1文件中定义了一个外部型变量count,并为其赋值为100,然后在Extern2文件中使用extern关键字声明了已经在第1个文件中定义的count变量,最后将其变量值显示到控制台。