![零基础C语言学习笔记](https://wfqqreader-1252317822.image.myqcloud.com/cover/191/36710191/b_36710191.jpg)
3.6 变量的存储方式
在C语言程序中可以选择变量的存储方式。变量的存储方式包括自动(auto)、静态(static)、寄存器(register)和外部(extern)共4种,可以通过存储方式告诉编译器要处理什么类型的变量。
3.6.1 auto变量
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_61.jpg?sign=1739193558-dstTiB0g0YaU2YcEBYmXEcHzWYL2X3lJ-0-805008651e14d72ef1f2aa0cc576c611)
auto变量又称为自动变量。在C语言程序中,每次执行定义局部auto变量的操作,都会产生一个新的变量,并且对这个变量重新进行初始化。
例如,在AddOne()函数中定义一个auto类型的整型变量iInt,并且对变量iInt进行加1操作,然后在主函数main()中调用两次AddOne()函数,代码如下(实例内容参考配套资源中的源码):
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_62.jpg?sign=1739193558-PdrR7KT1rqH4u4XGf3pWKm5yeB7ANx2I-0-4fda0e1b42b721fd025e1f75182f618b)
运行上述程序,运行结果如图3.9所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_63.jpg?sign=1739193558-KOyBoF95djUPggtEnBxnqQqz3YHkfMdK-0-823d3732449c27e741d2bd7538757850)
图3.9 auto变量程序的运行结果
根据运行结果可知,每次调用AddOne()函数,都会重新定义一个iInt变量,并且对该变量进行初始化。也就是说,在AddOne()函数中定义整型变量时,系统会为其分配内存空间;在函数调用结束后,系统会自动释放这些内存空间。
学习笔记
auto关键字可以省略,如果不特别指定,那么局部变量的存储方式默认为自动。
3.6.2 static变量
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_64.jpg?sign=1739193558-bmOmeXx136HtSmJxGtyqLeoSYd337QEe-0-73beb00c637c17cbf89743b2166a0ac7)
static变量又称为静态变量。将函数的内部变量和外部变量定义为static变量的意义是不一样的。对于局部变量,static变量和auto变量是相对而言的,尽管二者的作用域都是仅限于声明变量的函数中,但是在语句块执行期间,static变量会始终保持它的值,并且初始化操作只在第一次执行时起作用,在随后的运行过程中,static变量会保持上一次执行该语句块时的值。
3.6.3 register变量
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_65.jpg?sign=1739193558-1xFiCW0MQt4WDZwqc1Pg9m89mPa71YU3-0-f40fc87e954ac09eb1b76abae22a17fd)
register变量又称为寄存器变量。使用register变量的目的是让程序员将某个指定的局部变量存储于计算机的某个硬件寄存器中,而不是存储于内存空间中。这样做的优点是可以提高程序的运行速度。
用户无法获得register变量的地址,因为大部分计算机的硬件寄存器都不占用内存空间。而且,即使编译器将register变量存储于可设定的内存空间中,用户也是无法获取变量的地址的。
下面来看一个实例,使用register关键字修饰整型变量,代码如下(实例内容参考配套资源中的源码):
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_66.jpg?sign=1739193558-PGe9BFIw9U7n6w0b0hqc2qCZFFK6eyG2-0-82b2ecf21ca8ee0ac60e4e7790a2d12b)
运行上述程序,运行结果如图3.10所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_67.jpg?sign=1739193558-yd0OjxiONcv0yX8qkC5rpx0YrSE2YRHr-0-bad47875b94665b62eda5d776ae5732e)
图3.10 register变量程序的运行结果
3.6.4 extern变量
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_68.jpg?sign=1739193558-4tKMRBkDvbzgQRGfVwOQPMiwUV3HMV8A-0-9fed2b0c698bff67c3359d0fddd280fa)
extern变量又称为外部变量。extern关键字用于定义程序中将要用到但尚未定义的外部变量。通常,外部存储类都用于声明在另一个文件中定义的变量。
一个项目是由多个C语言文件组成的,系统对这些C语言文件分别进行编译,然后将其链接成一个可执行模块。将这些C语言文件作为一个工程进行管理,并且生成一个工程文件,用于记录所包含的所有C语言文件。
下面来看一个实例,在Extern2文件中定义iExtern变量并给其赋值,在Extern1文件中声明该变量并输出该变量的值(实例内容参考配套资源中的源码)。
在Extern1.c文件中编写代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_69.jpg?sign=1739193558-XmvMMeUkdr7K7joRe9df4Q6SvVbNu54L-0-1b30d0d731ccde4b4a987ccff2173915)
在Extern2.c文件中编写代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_70.jpg?sign=1739193558-cDI9N60C0NySLPohTa1SJm7ezMvhg77n-0-23d5e34f2ae9965f6ea8d84ee19cdb36)
运行上述程序,运行结果如图3.11所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt004_71.jpg?sign=1739193558-cDPA2hBfwkghPdbzavUEwbOjq4rtRLl7-0-e76ff6887fe1a45e5202880683db6ef3)
图3.11 extern变量程序的运行结果