变量的性质
- 存储期 分为自动存储期和静态存储期
- 作用域 生效的位置,分为块作用域和文件作用域
- 链接 分为内部链接,外部链接和无链接,内部链接变量只属于一个文件,该文件的函数可以使用.外部链接可以共享给其他文件.无链接的变量属于一个单独的函数且不能共享.
变量默认的性质取决于他被定义的位置.分为两种:
- 在块(包括函数体内)内声明
- 自动存储期
- 块定义域
- 无链接
- 在程序的最外层(任意块外部)声明
- 静态存储期
- 文件作用域
- 外部链接
大多数情况下,默认的性质都是满足要求的.当无法满足要求时,可以通过指定明确的储存类型来改变变量的性质.
存储类型
变量的存储类型
auto
- auto只对块内的变量有效
- 自动存储期,块定义域,无链接
- 块内声明的变量默认就是auto
static
static在块内和块外的含义是不同的
块内部
- 变量为静态变量
- 静态存储期,块定义域,无链接
- 块内的static变量只被初始化一次.会被永久保留(即使离开块,第二次进入块时变量仍是上次的变量)
- 当需要写一个递归函数时,就可以使用static来保存变量值.
- 函数不能返回一个auto变量,因为离开函数块后这个变量所在的内存无法保证被其他东西写入.但是static变量的内存会被永久保存,因此函数可以返回一个static变量.
块外部
- 变量为内部链接,只能在该文件中使用.
extern
extern的用途可以看之前的大程序结构.
- 静态存储期.
- 作用域取决于声明的位置.
- 一般具有外部链接.如果在块外部被static声明过,再被extern声明就具有内部链接.
register
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
使用register的条件:
- register的值必须能被cpu接受
- register变量可能不在内存中,不能用&取地址
- 只有局部变量和形参可以作为寄存器变量.
- 局部静态变量不能作为寄存器变量.
- cpu的进村器数量有限,不能定义过多的寄存器变量.