局部变量是一个在函数内部定义的变量,它只能在本函数范围内使用,局部变量不能在函数间相互调用。形式参数也是局部变量,不同函数中的局部变量可以定义成相同的名字,因为他们代表不同的对象。
全局变量是在函数之外定义外部变量,顾名思义,全局变量可以被源文件中的函数调用,如果使用extern语句包含到其他源文件也可以被其他源文件中的函数调用。全局变量在程序的全部执行过程中占用固定地址的存储单元,当调用全局变量时,还要注意如果在同一源文件中,外部变量和函数中的局部变量同名,那么在局部变量作用范围内,局部变量的优先级会高于全局变量,换言之,全局变量会被“屏蔽”掉。
在C语言中每个变量和函数都有两个属性,即数据类型和数据存储类别。存储类别是数据在内存中存储的方式,存储方式分为静态和动态存储类,具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,则默认auto型会自动分配存储空间,属于动态存储方式。(www.xing528.com)
动态存储方式是在程序运行期间进行动态分配存储空间的方式,静态存储方式是指在程序运行期间分配固定的存储空间的方式。存储空间分为程序区、静态存储区和动态存储区,全局变量全部放在静态存储区中,在程序开始时分配空间,结束时释放;动态存储区中存放函数的形参、自动变量和函数调用时的现场保护和返回地址。
需要注意的是,static声明的局部变量在函数调用结束后会继续占用存储单元不释放,在下一次调用该函数时该变量的值是上次函数调用结束时的值。虽然静态局部变量在函数调用结束后仍然存在,但是它依然是局部变量,其他函数还是不能引用它。在实际工程中,静态局部变量主要用在需要保存数据的功能模块中,在能够使用静态局部变量的情况下尽可能地少用全局变量。
另外,extern声明全局变量可以扩展全局变量的作用域。就如前文所讲,在多文件中,采用extern声明的办法进行全局变量声明可以让其他源文件中的函数调用该变量。register变量是允许将局部变量的值放在CPU中的寄存器中,需要时直接从寄存器中取出来参加运算,不必再到内存中提取。使用register声明的变量调用速度会更快,但是CPU寄存器数量有限(一般ARM微处理器一共有37个32位寄存器,其中包括31个通用寄存器和6个状态寄存器),不能任意定义寄存器变量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。