内容来源:C和指针(第二版),人民邮电出版社。
我太懒了,直接剪贴了书上的内容,讲得比较详细。书上用的c语言的版本是ANSI 90,有点过时了。
总结起来就是:
一、存储类型
即指存储变量值的内存类型,有普通内存、运行时堆栈、硬件寄存器。
默认存储类型与变量声明位置有关:像全局变量这样代码块之外声明的变量存储在静态内存中,不在堆栈里,程序执行期间始终存在;代码块内声明的变量默认存储类型是自动的(automatic),称为自动(auto)变量,存储在堆栈中,执行到代码块时被创建,代码块执行完即被销毁。
注意!可以给自动变量加上关键字static,将它变为静态存储类型,它就会在程序运行期间一直存在,但是它的作用域是不变的,代码块外面还是不能用这个变量。
//自动变量转静态变量之后作用域不变,举个例子: #include<stdio.h> int main() { int a=10;printf("%d\n",a); { static int b=9; printf("%d\n",b); } //把下面这行注释掉,就可以正常输出10和9. //不注释就会报错:[Error] 'b' was not declared in this scope. //printf("%d\n",b); return 0; }
还有register存储类型,内容自己看吧,主要注意不要给很多变量都添加register关键字的声明,自己乱用register可能程序性能不升反降。
二、初始化
静态变量不显式初始化,会被自动初始化为0。
自动变量不显式初始化,里面的将会是废值。
但是如果自动变量显式地初始化了,其效果就是在代码块的起始处插入一条隐式的赋值语句,其结果就是:①自动变量初始化了,和它在代码块里给他赋值效率上没什么区别(声明为const的变量除外);②这条隐式的赋值语句在代码块每次使用时都会执行一次;③优点:可以用任何表达式为自动变量赋值;④不显式初始化得到的是废值。