STC单片机C语言指针
主讲:何宾
Email :hebin@mail.buct.edu.cn
2016.03
C51编译器中指针的分类
Cx51编译器支持使用字符“*”声明变量指针。C51编译器可
以执行在标准C中所提供的所有操作。但是,由于8051独一无二的
结构以及特点,C51编译器提供两种不同类型的指针,即:通用指
针和指定存储器的指针。
通用指针
--未指定存储区域的通用指针
C语言通用指针的声明格式:
数据类型 *指针名字
【例13-1】通用指针声明的例子
char *s; //指向字符的指针
int *number; //指向基本整型数的指针
long *state; //指向长整型数的指针
对于通用指针来说,使用三个字节保存。即第一个字节表示存储器
的类型;第二个字节表示偏移地址的高8位;第三个字节表示偏移
地址的低8位。对于通用指针来说,它可以访问保存在8051存储器
系统的任何位置的变量。
通用指针
--未指定存储区域的通用指针
前面提到过:
&变量/数组名字
它表示获取变量所在单片机存储空间的地址,或者是数组所在单片
机存储空间的起始地址。
例如:如下声明:
int *p1 ;
int a ;
当进行下面操作:
p1=&a;
通用指针
--未指定存储区域的通用指针
表示p1的值为变量a所在单片机存储空间的具体地址信息。该
地址的内容就是变量a的值,用形式化的方式可以这样表示:
(p1)=a;
因此,*p1实际上就是获取指向地址的内容。所以,*p1的值就是变
量a的值。
注 :在单片机中并不存在指针这样一个功能部件,正如上面所提到的,这只是C
语言对存储器直接寻址模式的抽象而已。
*和指针名字之间不能有空格。
通用指针
--未指定存储区域的通用指针
【例13-2】查看通用指针的例子
代码清单13-1(1) main.c文件
int main()
{
int a=50,*p1;
float b=45.13,*p2;
char c=40,*p3;
p1=&a;
p2=&b;
p3=&c;
return 0;
}
通用指针
--未指定存储区域的通用指针
下面对该程序进行分析,步骤包括:
读者可以进入到本书所提供资料的stc_program_example\例子
13-2目录下,在Keil
μVision5集成开发环境下打开该设计。
进入调试器模式,查看Disassembly窗口内的反汇编代码,代码
中加入了注释,帮助读者进行分析。
代码清单13-1(2) Disassembly窗口内的反汇编代码清单
2: {
通用指针
--未指定存储区域的通用指针
3: int a=50,*p1;
//将立即数50(0x32)保存到8051片内数据区地址为0x08和0x09的单元
C:0x0003 750800 MOV 0x08,#0x00
C:0x0006 750932 MOV 0x09,#0x32
4: float b=45.13,*p2;
//将浮点数保存到8051片内数据区地址为0x0D、0x0E、0x0F和0x10的单元
C:0x0009 75101F MOV 0x10,#0x1