从变量的作用域来分,变量可以分为全局变量和局部变量。

在一个函数内部定义的变量是局部变量,它只是在本函数范围内有效,在此函数外不能使用这些变量的。

全局变量可以供所有函数共用,它的有效范围为从定义变量的位置开始到本源文件结束。

全局变量的优点是:可以减少函数实参和形参的个数,从而减少内存空间以及传递数据时的时间消耗。

全局变量的缺点是:1.全局变量在程序的全部执行过程中都占用存储单元,而不仅仅在需要时才分配使用。

                                    2.使用全局变量过多,会降低程序的清晰性。

从变量值存在的时间(生存期)角度来分,变量可以分为静态存储方式和动态存储方式。

所谓静态存储方式就是指在程序运行期间分配固定的存储空间,而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间。

全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕后释放。

在动态存储区中存放一下数据:1.函数形式参数2.自动变量3.函数调用时的现场保护和返回地址等。

数据的存储方式分为两大类:静态存储和动态存储。具体包含四种:自动(auto),静态(static),寄存器(register),外部(extern)

1.auto变量

  函数中的局部变量,如不专门声明为static存储类别,都是动态分配存储空间的,数据存储在动态存储区,关键字auto可以省略,auto不写则隐含确定为自动存储类别,它属于动态存储方式。

2.static声明局部变量

  静态局部变量在函数调用结束后不消失保留原值,也就是其占用的存储单元不释放。

  静态局部变量在编译时赋初值的,只赋初值一次。

  如果定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(数值型变量)或者空字符(对字符型变量)。

3.register变量

 为了提高程序的执行效率,将局部变量的值放在cpu的寄存器中,需要时直接从寄存器中取出来参加运算。对寄存器的存取速度远远高于对内存的存取速度。

 注意:(1)只有局部变量和形式参数可以作为寄存器变量,全局变量不行。

             (2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。

             (3)局部静态变量不能定义为寄存器变量。

4.extern声明外部变量

根据函数能否被其他源文件调用,将函数分为内部函数和外部函数。

如果一个函数只能被本文件中其他函数调用,它为内部函数。在定义内部函数时加static,内部函数又称为静态函数。

如果在函数前面加上extern,则表示该函数是外部函数,可以供其他文件调用。C语言规定,如果定义函数时省略extern,则隐含为外部函数。