C语言入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

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变量,最后将其变量值显示到控制台。