提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
指针类型解读
1. 指针指向的数据的存储在data/idata
代码如下(示例):
unsigned char data tmp[10]={
0,1,2,3,4,5,6,7,8,9}; /* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char data * data pstr1 = tmp; /* pstr1本身在data内,指向的数据也在data内 */
unsigned char data * pdata pstr2 = tmp; /* pstr2本身在pdata内,指向的数据也data内 */
unsigned char data * xdata pstr3 = tmp; /* pstr3本身在xdata内,指向的数据也data内 */
Note:
- 指针 pstr1、pstr2和pstr3均占用1个字节
- 将上面的
data
换成idata
,效果相同
2. 指针指向的数据的存储在pdata
代码如下(示例):
unsigned char pdata tmp[10]={
0,1,2,3,4,5,6,7,8,9}; /* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char pdata * data pstr1 = tmp; /* pstr1本身在data内,指向的数据也在pdata内 */
unsigned char pdata * pdata pstr2 = tmp; /* pstr2本身在pdata内,指向的数据也pdata内 */
unsigned char pdata * xdata pstr3 = tmp; /* pstr3本身在xdata内,指向的数据也pdata内 */
Note:
- 指针 pstr1、pstr2和pstr3均占用1个字节
- 将上面的
data
换成idata
,效果相同 pdata
是xdata
的第一页(256Byte
),可以不使用dptr访问
3. 指针指向的数据的存储在xdata
代码如下(示例):
unsigned char xdata tmp[10]={
0,1,2,3,4,5,6,7,8,9}; /* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char xdata * data pstr1 = tmp; /* pstr1本身在data内,指向的数据也在xdata内 */
unsigned char xdata * pdata pstr2 = tmp; /* pstr2本身在pdata内,指向的数据也xdata内 */
unsigned char xdata * xdata pstr3 = tmp; /* pstr3本身在xdata内,指向的数据也xdata内 */
Note:
- 指针 pstr1、pstr2和pstr3均占用2个字节
- 将上面的
data
换成idata
,效果相同
4. 不指定数据类型(即data/idata/pdata/xdata
)
代码如下(示例):
unsigned char tmp[10]={
0,1,2,3,4,5,6,7,8,9}; /* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char * pstr = tmp; /* pstr本身在data内,指向的数据也在data内 */
Note:
- 指针 pstr占用3个字节
- 将上面的
data
换成idata
,效果相同 - 这种情况下,指针和指针指向的数据 存在的位置根据 keil中
Memory model("option for target--->Target")
指定模式决定
总结
提示:这里做以下总结:
- 当指明数据存储类型为非xdata时,指针只占用1个Byte;
- 当指明数据存储类型为xdata时,指针只占用2个Byte;
- 当不指定数据存储类型时,指针总是占用3个Byte。
- 如果不考虑执行速度,可以不指定指针存储类型,即:
unsigned char pdata tmp[10];
unsigned char pdata * pstr;
pstr=tmp;
- 指针存储类型决定了不同的寻址方式,进而决定了寻址速度。速度如下:data>idata>pdata>xdata
- 指针所指向的数据的类型必须与实际的数据类型相一致,不然会出错。比如:
unsigned char xdata tmp[10];
unsigned char data * data pstr;
pstr=tmp;
实际的数据tmp
定义在了 xdata
(X:0000H~FFFFH),但是定义的指针 pstr
却只能指向 data
(D:00H~7FH)