auto、 register 、static、extern 声明存储类型的区别:
定义与声明:
声明:告诉编译器名称和类型,不分配内存,不赋初值
定义:为了给变量分配内存,可以为变量赋初值
1.auto:自动存储类型变量
A.默认变量类型,定义变量,不指定为声明类型,则默认为auto。
B.以auto声明的变量,编译器会自动分配存储空间,并在程序执行结束后自动释放。
C.自动变量只能在函数内部使用,它们的作用域仅限于所在的代码块。在函数执行结束后,自动变量将会被自动释放,其值也会随之消失。若声明为全局变量,则在该文件中有效。
2.static:静态存储变量
static:静态的,静止的------>私有(隐藏)
A.static声明的变量的作用域取决于声明位置
全局:本文件
局部:本函数
B.声明周期:程序或进程结束而终止
C.好处:
隐藏变量或函数、隔离错误,有利于模块化程序
保持变量内容的持久性
默认初始化为0,同样全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00
D.static的用途
1.声明全局变量,可限制该变量仅本文件可见
2.声明局部变量,可延长生命周期,当该函数再次被调用时,变量的值是上次调用结束的值
3.静态函数,表示该函数经在本文件中可见
4.修饰类的成员为静态成员,表示该成员在本类中可见,多对象可共享
5.类的静态函数,表示可直接通过类名访问该函数。
3.register:寄存器存储变量
声明为寄存器变量,表示将该变量的值存入寄存器。
注:
1.声明为寄存器变量的类型应该是CPU寄存器所能接受的类型,寄存器变量是单个变量,变量长度应该小于等于寄存器长度。
2.不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址。
3.尽量在大量、频繁操作时使用寄存器变量,且声明的变量个数应该尽量少。
4.extern:外部存储变量
extern:外面的、外部的,表示该变量在外部进行了定义,则必然是全局变量
A.使用其他文件的函数或者变量的方式:
1.include头文件
2.extern,可避免大量的头文件引入以及无关函数的引入。