C51中#define与sfr的定义有什么不同.主要想通过指针得到I/O口地址.下例为什么不行?
c51中用的是Keil uVision2软件
#include <89x51x.h> //89x51x.h中有定义sfr P0 =0x80
#define JAVE 0X81
main()
{
char *p;
p=P0; //不通过
P=JAVE; //能通过
}
可以用的,头文件/reg52.h> 与基本相同.位定义的写法可能有点不同.这几个头文件都用过.主要想通过指针得到I/O口地址
追答我查看了一下资料。
在c51中,sfr预定义的标识名与“绝对地址”联系起来。它是一个“特殊”功能寄存器。特殊在这个名称既代表着一个字节的首地址名,又代表一个字节的变量名。
所以80c51中规定:专用的特殊功能寄存器(包括bit、sbit、sfr和sfrl6数据类型),不能通过指针进行访问!!!
所以你这样操作,编译时就会报错。
sfr的寄存器名称必须大写,定义之后可以直接对这些寄存器赋值。
因为他有预定义的绝对地址,在实际工程中,这种操作也用不到。实在想知道,就到头文件中看一下就知道了。
关于宏定义#define,就是完全“替换”,所以#define后面不能有“;”,否则,将“;”也会一起带进去,这样就出现错误。这里无需多述,想你肯定明白。