作用域:
局部变量
全部变量
存储分类
自动类: 局部变量
静态类:全部变量
C程序在内存中的存储映象:
动态存储区(堆栈)
静态存储区
程序代码区
动态存储区用来保存函数调用时的返回地址,自动类别的局部变量等
静态存储区用以存放全局变量及静态类别的局部变量
auto变量
float a; 等于 auto float a;
auto变量的存储单元被分配在内存的动态存储区.
生命期:所有自动类局部变量的存储单元都是在进入这些局部变量所在的函数体(或复合语句)时生成,退出所在函数体(或复合语句)时消失(变为无定义)..
有点:各个函数的变量相互独立不会互相干扰
register变量
寄存器变量也是自动变量,它与auto变量区别仅在于:用register 说明变量建议编译程序将变量的值保存到CPU的寄存器中,占内存单元. 程序运行时,访问存在于寄存器内的值比访问于内存中的值要快得多.因此当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register变量,有助于提高程序的运行速度.
注意:
1.CPU中寄存器的数量有限,因此只能说明少量寄存器变量.在一个函数中,允许说明为寄存器变量数目不仅取决于CPU类型,也与所用的C编译程序有关.当没有足够的寄存器来存放指定变量,或编译程序认为指定的变量不适合放在寄存器中时,将自动按auto变量来处理.因此,register 说明 只是对编译程序的一种建议,而不是强制性的
2.由于register变量的值是放在寄存器内而不是放在内存中,所以register变量没有地址,也就不能对它进行求地址运算,
3,register变量的说明应尽量靠近其使用的地方,用完之后尽快释放,以便于提高寄存器的利用效率.这可以通过把对register变量的说明和使用放在复合语句中来实现.
全局变量
1,不论是否需要,全局变量在整个程序运行期间都占用内存空间.
2,全局变量必须在函数以外定义,降低了函数通用性,影响了函数的独立性
3,使用全局变量容易因疏忽或使用不当而导致全局变量中的值意外改变,从而起副作用,产生难以查找的错误
extern变量
1,当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern 对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它开辟存储单元.这时其作用域从extern说明处起,延伸到该函数末尾.
注意:全局变量的说明与全局变量的定义不同:变量的定义(开辟存储单元)只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地方,这时必须用extern进行说明.
2,解决同一项目不同c源程序中的报错
在其中一个文件中定义所有全局变量,而在其他用到的这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译的单位中定义,通知编译程序不必再为他们开辟内存单元
static变量
当用static说明符说明全局变量时,此变量可称作"静态"全局变量.静态全局变量只限于本编译单位使用,不能被其他编译单位所引用.因此静态函数又被称为"内部"函数
注意:
一,static 变量只能初始化一次