C语言中有5个作为存储类型的关键字,它们是auto,register,static,extern以及typedef。主要总结前四个关键字的作用。
在介绍这几个关键字之前,先了解几个概念(作用域、链接、存储时期),我尽量用最通俗的语言描述一下,有些表达可能不那么准确,所以具体定义,大家自行查资料。
作用域:
其实就是说这个变量在哪些区域内有效。作用域包括:代码块作用域、函数原型作用域、文件作用域。分别指的是{}内有效、函数内部有效、文件内有效。
链接:
大概就是说这个变量能不能被作用域外的函数或文件调用。链接包括:外部链接、内部链接、空链接。外部链接指变量可以被多个文件调用,内部链接指变量只可以在该文件内部调用,空链接指变量归代码块或者函数私有,不能被其他调用。
存储时期
简单理解成给变量分配的内存是长期存在,还是短期存在。存储时期包括:静态存储时期和自动存储时期。静态存储时期就是指整个程序运行过程中,这个变量的内存一直存在,没有发生变化(长期存在)。自动存储时期是指当进入代码块或者函数时,编译器给这个变量分配内存,当代码块或者函数运行结束后,这个内存被释放(短期存在)。
auto
表示一个变量具有自动存储时期。一般用到的都是这个。
register
只能用于具有代码块作用域的变量。请求将变量存储在一个寄存器中,具体是否能实现,要看具体情况。
static
表示静态存储时期。
用于代码块作用域时,在程序运行期间(即使包含该变量的代码块并没有运行)存在并保留其值。
用于文件作用域时,表示该变量具有内部链接,文件内可调用。
extern
表示你在声明一个已经在别处定义了的变量。
具有文件作用域,所指变量具有外部链接,多个文件可以使用。
具有代码块作用域,可能有外部链接也可能有内部链接。
类型限定词
const表示不能通过赋值、增量或减量运算来修改该变量的值。其实就是防止变量被错误的修改。
volatile表示该变量不仅可以通过程序改变还可以被其他代理改变。例如硬件或者收到来自其他计算机的信息都会自动改变这个变量的值。
restrict只可用于指针,表明指针是访问一个数据对象的唯一且初始的方式。大概意思就是这个变量只能通过这个指针访问~
参考文献:C Primer Plus