APP下载

全局变量的应用浅析

2016-07-10管瑜琳

电子技术与软件工程 2016年7期

管瑜琳

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。利用全局变量的特性,可以进行自动读题,然后根据预置答案,从答案中进行正确挑选,自动进行人机对话。

【关键词】全局变量 存储区域 应用浅析

自动回答题库中的问题,在没有人工智能AlphaGo的情况下,是否可以实现?答案显然是有可能的。

在没有超级计算机,没有云计算,没有云数据的前提下,我们完全可以利用个人电脑,利用全局变量的特性,进行自动读题,然后根据预置答案,从答案中进行正确挑选,实现伪人工智能。

1 变量定义及存储区域

在程序语言中,对于基本数据类型量,按其值是否可变又分为常量和变量两种。变量按作用域范围又可分为两种:局部变量和全局变量。除此以外,变量还有外部变量、内部变量、静态变量以及动态变量等这些叫法。

在这里,我们只是对这些变量进行简单的定义阐述,并区分变量各自的存储区域,并着重说明全局变量的一些特殊应用。

1.1 变量定义

常量——在程序执行过程中,其值不能改变的量。常量可以直接用1个数来表示,称为常数(或称为直接常量)。

变量——在程序执行过程中,其值可以改变的量。

局部变量——Local Variable,也称为内部变量,定义在函数内部,它的作用域仅限于函数内, 离开该函数后再使用就是错误的。

全局变量——Global Variable,也称为外部变量,定义在所有函数外部,它的作用域是整个源程序。

静态变量——就是在定义的时候,有static 修饰的变量。

动态变量——在程序执行过程中建立,随函数的调用动态分配存储空间,调用结束,释放空间。

这么多变量,其实各种名称都是相对的,例如:常量与变量,局部变量与全局变量,都是从不同的角度而言。

1.2 变量的作用域

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量也只有局部作用域,它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

1.3 变量的存储区域

用户存储空间可以分为三个部分:程序区、静态存储区、动态存储区。因此从另一个角度而言,从变量值存在的作时间(即生存期)角度来分,变量又可以分为静态存储方式和动态存储方式。

静态存储方式:是指在程序运行期间分配固定的存储空间的方式。

动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

全局变量、静态局部变量、静态全局变量全部都在静态存储区分配空间,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在整个程序执行过程中,它们占据固定的存储单元,而不进行动态的分配和释放。

局部变量、动态变量在动态存储区分配空间。除此以外,动态存储区还存放以下数据:动态申请的变量,函数形式参数,函数调用实的现场保护和返回地址等,即通常工程师平常提到的“堆”和“栈”(堆和栈是分别指向不同的区域)。

2 全局变量应用浅析

从定义、作用域和存储区域等方面进行了各种阐述,可以得出以下几个结论:

(1)动态变量由于分配的时间、次序不同,而导致地址也很有可能不同。

(2)局部变量的地址是跟其作用域相关的函数有关,因此地址可以说是固定的。

(3)静态存储方式的全局变量、静态全局变量、静态局部变量,其地址都是在编译过程中就为其分配好了。只要bin(这个bin是泛称,即软件项目工程最终编译生成目标,有可能是exe执行程序,也有可能是一个单片机的二进制文件,与最终后缀名无关)不变,其地址就不会改变。甚至可以说,库不变,库中的静态存储方式的全局变量也不会发生变更。

说了这么多,其实就是让大家明白一点:在一个正式发布的应用程序再次升级前,这个应用程序中的静态存储方式的全局变量、静态全局变量、静态局部变量(下文简单点只说全局变量),其地址是固定不变的,不会每次运行得到不同的值(当然这个地址是针对其所在的Task而言)。因此,如果我们得到程序某个全局变量的地址,以后可以直接对这个地址进行操作,这个地址在应用程序升级。

知道了全局变量是固定的地址,那么会有什么信息是用全局变量的?

软件开发者为了开发方便,有时会定义全局变量以方便使用。比如在游戏中常会出现的人机对话页面,那么怎样才能自动读题,自动作答呢?

人机界面对话的题库内容肯定是个常量,但是在显示时有可能会将内容复制到一个全局变量的buffer中,甚至标准答案可能也是固定地址。那我们可以通过人机对话对话框的固定地址来解析具体是题库中的哪个问题,甚至将ABCD选项和标准答案进行内容匹配来判断最终正确的选项是哪个。这样的情况下,只要一出现人机对话,就可以知道问道问题是题库中的哪一个,然后回答中的选项与标准答案进行比对,自动进行人机对话应答。

3 结束语

在大型程序的开发过程中,数据共享问题是一个复杂的综合性问题,在开发之前,合理的定义全局变量的函数名和定义,能够有效的提高读写效率,减少由于实际参数和形式参数的数据传递带来的时间消耗。

参考文献

[1]谭浩强.C语音程序设计(第一版)[M].北京:清华大学出版社,2004.

作者单位

上海飞机设计研究院综合航电系统研究部 上海市 201210