新手必看 什么是c语言程序设计( 三 )


① 自动变量
自动变量是以关键字auto标识的变量类型,其一般是在函数的内部或者复合语句中使用 。
自动型变量的作用域范围是函数或者复合语句的内部 。在C51中,函数或复合语句内部定义自动变量时,关键字auto可以省略,即默认为自动型变量 。
在程序执行过程中,自动变量是动态分配存储空间的 。当程序执行到该变量声明语句时,根据变量类型自动为其分配存储空间 。当该函数或者复合语句执行完毕后,该变量的存储空间将立刻自动取消,此时,该自动变量失效,在函数或者复合语句外部将不能够使用该变量 。
② 全局变量
全局变量是以关键字标识的变量类型,如果一个变量定义在所有函数的外部,即整个程序文件的最前面,那么这个变量便是全局变量 。全局变量有时也称为外部变量 。
在编译程序时,全局变量将被静态地分配适当的存储空间 。该变量一旦分配空间,在整个程序运行过程中便不会消失 。因此,全局变量对整个程序文件都有效,即全局变量可以被该程序文件中的任何函数使用 。
③ 静态变量
静态变量以关键字定义,从变量作用域来看,静态变量和自动变量类似,作用域只是定义该变量的函数内部 。如果静态变量定义在函数外部,将具有全局的作用域 。
而从内存占用的角度,静态变量和全局变量类似,其始终占有内存空间 。
④ 寄存器变量
单片机的CPU寄存器中也可以保存少量的变量,这种变量称为寄存器变量 。寄存器变量以关键字声明 。
由于单片机对CPU寄存器的读写十分快,因此寄存器变量的操作速度要原高于其他类型的变量 。寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度 。
由于单片机资源有限,程序中只允许同时定义两个寄存器变量 。如果多于两个,在编译时会自动地将其他的寄存器变量当做非寄存器变量来处理 。
(2)存储器类型
存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位 。表3-4中是KEIL 所能认别的存储器类型 。

新手必看  什么是c语言程序设计

文章插图
表3-4存储器类型
提示
在芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠 。
如果省略存储器类型,系统则会按编译模式small,或large所规定的默认存储器类型去指定变量的存储区域 。
① small存储模式
small存储模式将函数参数和局部变量放在片内RAM(默认变量类型为DATA,最大128字节) 。另外所有对象包括栈都优先放置在片内RAM,当片内RAM用满,再向片外RAM放置 。
② 存储模式
存储模式中将参数和局部变量放在片外RAM(默认存储类型是PDATA,最大256字节);通过R0、R1间接寻址 。
③ large存储模式
large存储模式将参数和局部变量直接放入片外RAM(默认的存储类型是XDATA,最大64KB);使用数据指针DPTR间接寻址,因此访问效率较低 。
(3)对变量进行绝对定位
C51扩展的关键字_at_专门用于对变量作绝对定位,_at_使用在变量的定义中,其格式为:
[存储类型] 数据类型 [存储区] 变量名1 _at_ 地址常数[,变量名2&;]
例如:
① 对data区域中的char变量aa作绝对定位:
char data aa _at_ 0x30;
② 对pdata区域中的int数组cc作绝对定位:
int pdata cc[10] _at_ 0x34;
③ 对xdata区域中的char变量作绝对定位:
char xdata_at_ ;
对变量绝对定位的几点说明:
① 绝对地址变量在定义时不能初始化,因此不能对code型常量绝对定位;