编辑: 丶蓶一 | 2014-10-18 |
本章我们就会学习到点阵LED的控制方式,按照惯例,先普及部分C语言知识. 7.1?变量的作用域 所谓的作用域就是指变量起作用的范围.变量按他的作用域可以分为局部变量和全局变量 1.局部变量 在一个函数内部声明的变量是内部变量,他只在本函数内有效,在此函数以外是不能使用的,这样的变量就是局部变量.此外,函数的形参也是局部变量,形参我们后边详细解释. 比如上节课定义的unsigned?long?stopwatch?=?0,这个变量是定义在main函数内部的,所以只能由main函数使用,中断函数就不能用这个变量.同理,我们如果在中断函数内部定义的变量,在main函数中也是不能使用的. 2.全局变量 在函数外声明的变量是全局变量.一个源程序文件可以包含一个或者多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束. 比如上节课的unsigned?char?LedNumber[6]?=?{0};
?这个数组的作用域就是从开始定义的位置一直到程序结束,不管是main函数,还是中断函数InterruptTimer0,都可以直接使用这个数组. 局部变量只有在声明它的函数范围内有效,而全局变量可以被作用域内的所有的函数直接引用.所以在一个函数内既可以使用本函数内声明的局部变量,也可以使用全局变量.在习惯上,我们把全局变量定义在我们程序所有函数的最前边. 由于函数通常只能有一个返回值,但是我们希望一个函数运行完了可以提供多个结果值给我们使用的时候,我们就可以利用全局变量来实现.但是考虑到全局变量的一些特征,应该限制全局变量的使用,过多使用全局变量也会带来一些问题. (1)全局变量可以被作用域内所有的函数直接引用,可以增加函数间数据联系的途径,但同时加强了函数模块之间的数据联系,使这些函数的独立性降低,对其中任何一个函数的修改都可能会影响到其他函数,函数之间过于紧密的联系不利于程序的维护. (2)全局变量的应用会降低函数的通用性,函数在执行的时候过多依赖于全局变量,不利于函数的重复利用.我们现在程序编写比较简单,就一个.c文件,将来以后我们要学到一个程序中有多个.c文件,当一个函数被另外一个.c文件调用的时候,必须将这个全局变量的变量值一起移植,而全局变量不只被一个函数调用,这样会引起一些不可预见的后果. (3)过多使用全局变量会降低程序的清晰度,使程序的可读性下降.在各个函数执行的时候都可能改变全局变量值,往往难以清楚的判断出每个时刻各个全局变量的值. (4)定义全局变量会直接占用单片机的内存单元,而局部变量只有进入定义局部变量的函数内才会分配内存,函数退出后会自动释放所占用的内存.所以大量的全局变量会额外增加内存占用. 综上所述之原因,我们一项原则就是尽量减少全局变量的使用,能用局部变量代替的就不用全局变量. 还有一种特殊情况,大家在看别人程序的时候注意.C语 言是允许局部变量和全局变量同名的,他们定义后在内存中占有不同的内存单元.如果在同一源文件中,全局变量和局部变量同名,在局部变量作用域范围内,只有 局部变量有效,全局变量不起作用,也就是说局部变量具有更高优先级.但是我们在编写程序的时候,尽量不要让变量重名,以避免不必要的误解. .2?变量的存储类别 变量的存储类别分为自动、静态、寄存器和外部这四种.其中后两种我们暂不介绍,主要是自动变量和静态变量这两种. 函数中的局部变量,如果不加static这个关键字来进行特别声明,都属于自动变量,也叫做动态存储变量.这些存储类别的变量,在调用该函数的时候系统会给他们分配存储空间,在函数调用结束后会自动释放这些存储空间.动态存储变量的关键字是auto,但是这个关键字是可以省略的,所以我们平时都不用. 那么与动态变量对应的就是静态变量.首先,全局变量均是静态变量,此外,还有一种特殊的局部变量也是静态变量.即我们在局部变量声明前边加上static这个关键字,加上这个关键字的变量就称之为静态局部变量,他的特点是,在整个生存期中只赋一次初值,函数调用的时候,如果是第一次调用,它的值就是我们给定的那个初值;