背景:
阅读内容

c语言中指针类型和存储区的关系

[日期:2009-06-08] 来源:本站编辑  作者:佚名 [字体: ]
一、存储类型与存储区关系 

data ---> 可寻址片内ram 
bdata ---> 可位寻址的片内ram 
idata ---> 可寻址片内ram,允许访问全部内部ram 
pdata ---> 寻址片外ram (MOVX @R0) (256 BYTE/页) 
xdata ---> 可寻址片外ram (64k 地址范围) 
code ---> 程序存储区 (64k 地址范围),对应MOVC @DPTR 

二、指针类型和存储区的关系 

对变量进行声明时可以指定变量的存储类型如: 
uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。 

同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的 
使用如: 

uchar xdata * data pstr 

是指在内ram区分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向xdata区("*"前xdata关键字的作用), 
可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。 

...... 
uchar xdata tmp[10]; //在外ram区开辟10个字节的内存空间,地址是外ram的0x0000-0x0009 
...... 
第1种情况: 

uchar data * data pstr; 
pstr=tmp; 

首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编 
代码: 

MOV 0x08,#tmp(0x00) ;0x08是指针pstr的存储地址 

看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在"*"号前的那个),所以按KeilC编译环境来说 
就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的 
默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。 

第2种情况: 

uchar xdata * data pstr; 
pstr = tmp; 

这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向 
xdata区("*"前xdata关键字的作用)。编译后的汇编代码如下。 

MOV 0x08,#tmp(0x00) ;0x08和0x09是在内ram区分配的pstr指针变量地址空间 
MOV 0x09,#tmp(0x00) 

这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。 

第3种情况: 

uchar xdata * xdata pstr; 
收藏 推荐 打印 | 录入:admin | 阅读:
产品购买方式
广州市东哥电子科技有限公司欢迎您
东哥单片机学习网--提供单片机学习开发板,单片机实验板,编程器,仿真器,无线发射接收控制模块,电子元器件,单片机技术交流,是单片机爱好者,单片机初学者,电子工程师不容错过的单片机学习交流网站。
1.广东省可以货到付款(即货到了你把钱给快递公司),购物零风险.
2.外省的需先转账后发货,部分城市可以货到付款,需外加3%代收手续费.
3.可以通过本站淘宝店购买(淘宝网担保交易购物零风险).
淘 宝 店:进入本站淘宝店请点击
业务咨询:罗小姐/廖先生
技术咨询:廖先生
联系电话:020 86307431
联系手机:13512767404
购买方式:查看请点击
公司地址:广州市天河新赛格电子城二楼
您还可以通过QQ咨询:279068079