在C语言中,变量有三种类型:自动变量(automatic variable)、静态变量(static variable)和寄存器变量(register variable),他们大部分地方都是相似的,但是每个都有各自的特性。
自动变量(automatic variable):
这是最常用的变量,声明和初始化格式类似int a = 0;
。如果不初始化,它的值是未定义的初始值。每次函数调用的时候,也就是重新进入该变量的作用域的时候,变量会重新初始化。而且自动变量的初始化并不被限定为常数,而是可以包含任何式子——先前定义的值,甚至是调用函数。此外,自动变量的名称可以和外部变量或者函数的名称重复,这时候会隐藏外部变量或者函数(不推荐重复名称来使用,这样会导致混乱或者恶性bug)。
静态变量(static variable):
静态变量和自动变量很像,声明和初始化的格式类似static int a = 0;
。如果不初始化,它的值是0
。不同之处是它的值是永久存储的,而不会随着函数再次调用而再次初始化;而且静态变量初始化必须是一个常数式。
寄存器变量(register variable):
这种变量一般用于程序中某个变量被重度使用,为了提升性能。声明格式类似register int a;
。如果不初始化,它的值是未定义的初始值。而且寄存器变量和自动变量一样,初始化并不被限定为常数,而是可以包含任何式子:先前定义的值,甚至是调用函数。如果使用这种类型的变量,会将变量放入寄存器中,由于存储层级关系,这样会提升性能。但是受限于基础设备限制,只有少数变量能被放入寄存器,放不下全部的。并且需要注意的是:1.register
声明只能声明自动变量和函数的参数。2. 编译器可以自由忽略我们标注的register
,只将其当作自动变量来处理。3. 无法获取寄存器中变量的地址。4. 寄存器变量的数字和类型的限制取决于机器。
此外,需要注意
只有纯量变量(scalar variable)可以在定义的时候初始化。如果定义一个数组,不论使用哪种变量,数组中少的元素都会用纯量变量(scalar variable)被用于表示单独且固定大小的数据对象,例如整数、浮点数、字符串和布尔值。
0
补齐。例如s[3] = {1 , 2}
,我们定义她有三个元素,但是实际上我们只给了两个值,这个时候第三个元素就是0
。