c中的每一个变量和函数都有两个属性:类型(type)和存储类型(storage class).存储类型分别是auto(自动),extern(外部),register(寄存器),static(静态)
1.auto
在函数体中定义的变量缺省是auto.
当进入代码块(block)时,系统为自动变量分配内存.在块内,这些变量被定义,并被认为他们是局部于本块的.当退出块时,系统释放分配给自动变量的内存,因此,变量值就丢失了.重新进入块,系统会为自动变量再次分配内存,原先的值已经没有了.
2.extern
在函数的外部声明变量,就为变量永久的分配存储,它的存储类型是extern.
定义在函数外部的变量的存储类型都是extern,既不使用关键字extern.
使用extern关键字是告诉,编译器”在本文件或其他文件中寻找它”.既a文件中int a =1
在b文件中则可以使用extern int a;
来调用它.
外部变量从不会消失,因为外部变量在整个程序执行期间都是存在的.
两种方式向函数传递信息:1.使用外部变量.2.使用参数.当函数从其内部而不是通过参数表改变全局变量时,会产生副作用.这样的构造容易引发错误.正确的做法是通过参数和返回机制影响全局变量.
3.register
register高速编译器应该把有关的变量存储在高速的内存寄存器中.使用存储于类型register是要试图改善执行速度.当关系速度时,可选择一些最经常访问的变量,并把他们的存储类型声明为register.
register i;
等价于register int i;
,register默认是int类型.
4.static
1.允许局部变量保存它的原有值,以便再进入块时使用.
void f(void)
{
static int cnt = 0;
}
当第一次调用函数时,把变量cnt初始化为0,在退出函数时,cnt的值被保存在内存中.当再次调用函数时,就不用再对cnt进行初始化,cnt扔保留着上次调用函数时的值.
2.在函数外部声明static
,则次变量是本文件可访问(私有privacy),外部文件不能访问.