C语言指针说明以 * 为分隔符,
“*” 前面的存储类型修饰—指针所指向的对象数据的存储位置;
“*” 后面的存储类型修饰—指针本身所分配的存储位置。
所以unsigned char xdata *p; 和xdata unsigned char *p 不一样。说明的是2回事。
而:
xdata unsigned char *p; 和 unsigned char * xdata p; 完全一样。
因为C写法中允许“最前面的存储类型修饰符修饰最后面的对象。”
且看下面示例程序证明:
; unsigned char xdata * p0;
;
; xdata unsigned char * p1 ;
;
; uchar a=0x20;
;
; void main()
;{
; p0=&a;
; p1=&a;
;}
NAME POINTER
?PR?main?POINTER SEGMENT CODE
?C_INITSEG SEGMENT CODE
?DT?POINTER SEGMENT DATA
?XD?POINTER SEGMENT XDATA
EXTRN CODE (?C_STARTUP)
PUBLIC a?
PUBLIC p1
PUBLIC p0
PUBLIC main
RSEG ?DT?POINTER
p0: DS 2 //p0指针被定义在data区。
a?: DS 1
RSEG ?XD?POINTER
p1: DS 3 //p1指针被定义到到xdata区。
RSEG ?C_INITSEG
DB 001H
DB a?
DB 020H
; #pragma src
;
;
RSEG ?PR?main?POINTER
main:
; SOURCE LINE # 11
; {
; SOURCE LINE # 12
;
; p0=&a;
; SOURCE LINE # 14
MOV p0,#HIGH (a?)
MOV p0+01H,#LOW (a?) //p0-2字节指针立即寻址
; p1=&a;
; SOURCE LINE # 15
MOV DPTR,#p1
CLR A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (a?)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (a?)
MOVX @DPTR,A //p1-3字节通用指针间接寻址。
;
; }
; SOURCE LINE # 17
RET
; END OF main
END