C51的存储种类和存储器类型
C51的存储种类和存储器类型
1.自动变量(auto)
char chr=‘a’;等价于 auto char chr=‘a’;
注意自动变量的作用域
在main函数和符合语句中分别定义了一个同名的字符型自动变量并输出,结果证明符合语句中自动变量的作用域仅限于符合语句中。
#include
void main()
{
char chr='a';
{
char chr='b';
printf(
}
printf(
}
程序运行结果为
b
a
2.外部变量(extern)
C51语言允许将大型程序分解为若干个独立放入程序模块文件,各个模块可以分别进行编译然后再连接在一起,在这种情况下,如果某个变量要在其他程序模块文件中使用,只要在一个程序文件中将该变量定义为全局变量,而在其他程序模块文件中使用“extern”说明该变量时已经被定义过的变量就可以了。 在整个程序中都具有相同名字的外部变量只能在一处进行定义和初始化。
#include
char chr_1='a';
void main()
{
extern char chr_2;
printf(
printf(
}
char chr_2='b';
程序运行结果
a
b
chr-1是一个全局变量,不需要使用extern进行声明,而chr-2在定义前被使用,因此使用前必须使用extern进行声明。
3.静态变量(static)
分为内部静态变量(又称局部静态变量)和外部静态变量(又称全局静态变量)
内部静态变量是在函数内部定义的,与自动变量相比,其作用域同样限于定义内部静态变量的函数内部,但内部静态变量始终是存在的,其初值只是在进入时赋值一次,退出函数后变量的值仍然保存但不能访问。
内部静态变量放入用法以及与自动变量的区别
#include
void main()
{
char i;
for(i=0;i
{
static int s_int=1;
int a_int=1;
printf(
printf(
printf(
s_int=s_int+1;
a_int=a_int+1;
}
}
程序运行结果
s_int=1 a_int=1
s_int=2 a_int=1
s_int=3 a_int=1
在复合语句中分别定义一个内部静态变量和自动变量,进入复合语句中3次,结果显示由于退出复合语句时内部静态变量仍然存在并保存其值,自动变量则不复存在,因此内部静态变量能够累加,而自动变量则不能。
4.寄存器变量
在变量名前加上存储器种类符号“register”。不推荐
存储器类型
1..DATA区是存放临时性传递变量或使用频率较高的变量的理想场所
2.SDATA区其实就是DATA区中的位寻址区
Unsigned int bdata status;//在BDATA区定义一个变量
Sbit status_1=status^1;
不允许在BDATA区声明float和double型的变量
3.IDATA区
8051系列的一些单片机如8052附有128字节的内部RAM(80H~FFH),被称为IDATA,因为IDATA区的地址和SFR的地址重合,所以通过寻址方式来区分二者,IDATA区只能通过间接寻址来访问。IDATA区也可存放使用比较频繁的变量,使用寄存器作为指针进行寻址。
4.PADTA区和XDATA区
5.CODE区用来存放可执行代码,还有其他非易失性信息,如查询表。
存储模式
1.(SMALLA)小模式
在该模式下所有变量都默认位于片内数据存储器,这和使用data指定存储器类型的作用一样。此模式对变量访问的效率很高,但所有的数据对象和堆栈的总大小不能超过内部RAM 的大小。
2.(COMPACT)紧凑模式
所有变量都默认位于片外数据存储器的一页(256字节),但堆栈位于片内数据存储器内,这和使用PDATA指定存储器类型的作用一样,该模式适用于变量不超过256字节的情况。地址的高字节往往通过端口2输出,其值必须在启动代码中设置。这种模式不如SMALL模式高效,对变量访问的速度要慢一些。
3.(LARGE)模式
所有变量都默认位于片外数据存储器内,这和使用XDATA指定存储器类型的作用一样,使用数据指针DPTR进行寻址,效率较低,会产生更多代码。