51Testing软件测试网]#UW6]vk,^ C存储类分为两类:自动存储类(automatic)和静态存储类(static)。声明对象时使用的存储类说明符以及声明的上下文共同决定了对象的存储类。51Testing软件测试网[.IX sK
D~4af@b0 自动存储类对象对于一个程序块来说是局部的,在退出程序块时该对象将消失。51Testing软件测试网#S?_ T3d
[$_
-[$Bb3uH%L5Ce0 (1)如果没有使用存储类说明符,或者如果使用了auto限定符,则程序块中的声明生成的都是自动存储类对象。51Testing软件测试网R%B%u"B~l{F+^Y
M
51Testing软件测试网A/W)s9Z6xH`dz (2)声明为register的对象也是自动存储类,并且如果可能,将被存储在机器的快速寄存器中。
NxQq{9fl k0
2c(O*s5P1c ~a0 静态对象可以是某个程序块的局部对象,也可以是所有程序块的外部对象,在退出和进入函数或程序块时其值将保持不变。
Rh-Dh"r0
s&kd4iG[ld0 (1)在一个程序块内,静态对象用关键字static声明。51Testing软件测试网/{mLq,z^D"j"U \1Kz
51Testing软件测试网;oOm+PJ_h
c (2)在所有程序块外部声明且与函数定义在同一级的对象总是静态的。51Testing软件测试网ux/qi+k~+~;I |\
51Testing软件测试网 D7gTG;E)FFInQw (3)可以通过static关键字将对象声明为某个特定翻译单元的局部对象,这种类型的对象将具有内部链接。
*C&M"Ym4QR0
51Testing软件测试网GJ%h'}g0|,\{w (4)当省略显式的存储类或通过关键字extern进行声明时,对象对整个程序是全局访问的,并且具有外部链接。51Testing软件测试网'@Z QT KO,Y"w8H
51Testing软件测试网#L2V$nZ,o i7jm3L'G 存储类说明符有auto, register, static, extern和typedef。
%o{ci j~[0
hU9d{{:uZ
ahj0 (1)auto和register将声明的对象说明为自动存储类对象,这些对象仅可用在函数中。这种声明也具有定义的作用,并将预留存储空间。register说明的声明等价于auto说明51Testing软件测试网+ynw0DO4jp
-j$f&hjV6g1Rv0Q!F0 的声明,所不同的是,register暗示了声明的对象将被频繁地访问,将尽可能存储在寄存器中。如果一个对象被声明为register,则将不能对它应用一元运算符&,声明为register
;Xd8[
sy4q0
XvB3~zq0 但实际按照auto类型处理的对象的地址进行计算是非法的。
HS{s{
J;SN@0
\L:F!^9C0 (2)static将声明的对象说明为静态存储类。这种对象可以用在函数内部或者函数外部。在函数内部,该说明符将引起存储空间的分配,具有定义的作用。在函数外部,该说51Testing软件测试网PM c!F)b)I:kV2zq
qC~wO9V)}0 明符将引起声明对象为具有内部链接。51Testing软件测试网
lSoiutO7sh
51Testing软件测试网9iH.@,?3SB
m9T
b#i (3)函数内部的extern声明表明,被声明的对象的存储空间定义在其他地方。在函数外部,说明声明的对象具有外部链接。
wlrhH4^eW0
iB~uFz0 (4)typedef说明符并不会为对象预留存留空间。之所以将它称为存储类说明符,是为了语法描述上的方便。51Testing软件测试网xl,w[(C`*A
51Testing软件测试网x}8f6@M 一个声明中最多只能有一个存储类说明符。如果没有指定存储类说明符,则按照下列规则进行:
D!N@ucC9J0
51Testing软件测试网}5|LtdjM!yf8o (1)在函数内部声明的对象被认为是auto型;
%_r C-vw_?0
coy'n6MK)o#B0 (2)在函数内部声明的函数被认为是extern类型;51Testing软件测试网x;i'I;p*C7c
,NJ\j`R0 (3)在函数外部声明的对象与函数将被认为是static类型的,具有外部链接。51Testing软件测试网1_X^bOEe+r
51Testing软件测试网SGy1~
vt 类型限定符可以用于指定被声明对象的特殊属性,可以与任何类型说明符一起使用。类型限定符有:const和volatile。51Testing软件测试网odvi-mu3O
51Testing软件测试网t#mJ Z-k,k1a (1)const用于声明可以存储在只读存储器中的对象,并可能提高优化的可能性。可以对const对象进行初始化,但在初始化以后不能进行赋值。
9\"D@.Y-^
DZP~0
51Testing软件测试网7beT4jo (2)volatile用于强制某个实现屏蔽可能的优化。例如,对于具有内存映像输入/输出的机器,指向设备寄存器的指针可以声明为指向volatile的指针,目的是防止编译器通过51Testing软件测试网lO ]8XOb
51Testing软件测试网 b0J/^4uF
a2IK;} 指针删除明显多余的引用。volatile对象没有与实现无关的语义。51Testing软件测试网1Y{-Z k.X
`({#~K)yiE.tX0 总结一下以上关键字说明的对象:
k6uyEVf0
51Testing软件测试网@ {"d;I1fQ7E (1)static-静态变量,作用范围在一个文件内,只有在文件内的代码可以访问;51Testing软件测试网`&\O(e E~#P
S^q
51Testing软件测试网h
A(Gf\;ff-C (2)register-寄存器变量,可能的情况下会直接存放在机器的寄存器中;51Testing软件测试网i{(WMiXd?)u7|
H\a'BG6Q[/i0 (3)auto-存储类型标识符,表明变量具有本地范围、块范围的声明;
G$fmDK
p0
51Testing软件测试网Sw0J5T F9|9PAl
n6n (4)extern-外部链接,即该变量或函数在其他文件中可见;51Testing软件测试网7[/Qy"`_&CF
51Testing软件测试网#wR0[X"{1o0EA9A~ (5)const-对象或变量不能被改变,能提高程序的健壮性;51Testing软件测试网9W Hv
RT'g ^`\
"U_hDz%R
h'w"^f7F0 (6)volatile-限定一个对象可被外部改变。51Testing软件测试网:Lp"R,kyeWsb#h