打印

哈哈!问问xbyte

[复制链接]
4480|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dennisqun|  楼主 | 2007-8-21 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2007-8-21 16:17 | 只看该作者

不懂都神秘...

使用特权

评论回复
板凳
infree| | 2007-8-21 17:29 | 只看该作者

以前还真没好好琢磨过它

从其它嵌入式的C带来的习惯,一直使用*(unsigned char volatile xdata *)(0x2000)=0xFF这类的方式来进行对外部绝对地址的字节访问。
刚才查了一下ABSACC.h,XBYTE的定义是这样的,
#define XBYTE ((unsigned char volatile xdata *) 0),
其实XBYTE就相当于一个指向外部数据区的无符号字符型变量的指针(的名称,且当前的指针指向外部RAM的0地址),而在C里面指针一般和数组是可以混用的。这样也就相当于存在  一个定义在外部数据存储器的数组XBYTE[65536],直接使用下标就可访问其中的每个单元。

//下面是猜想,欢迎大家验证
这里的XBYTE是定义在0地址的,如果将其定义在其它地址则可以禁止通过XBYTE对低端存储区的访问,如
#define XBYTE ((unsigned char volatile xdata *) 0x2000),
则XBYTE[9]访问的应是0X2009这一外部RAM的单元,而不是外部RAM的0x0009单元的内容,因为数组访问不能使用负数下标,所以通过这种方式就无法访问到小于0x2000的外部RAM单元的内容了。

使用特权

评论回复
地板
ayb_ice| | 2007-8-22 07:38 | 只看该作者

啥叫"而在C里面指针一般和数组是可以混用的"...

应试说本质是相同的...

使用特权

评论回复
5
computer00| | 2007-8-22 08:36 | 只看该作者

呵呵,倒过来写都行...

例如,  200[XBYTE]=xxx;

char buff[10];
//或者用 char *buff=&buffer;

buff[3]=0xaa;
3[buff]=0xaa;  //居然是一样的,倒塌...

因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),
因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...非典用法,请勿乱用,出了事偶不负责...

使用特权

评论回复
6
ayb_ice| | 2007-8-22 08:42 | 只看该作者

本质就是强制指针变换,有什么神秘的...

使用特权

评论回复
7
infree| | 2007-8-22 09:13 | 只看该作者

个人觉得5楼的解释很合理

佩服!
我记得以前这里也有过关于C语言的这类问题的讨论,可是当时没有进入到更深的层次,好像只讨论到5楼所提到的两种方式在C中均可使用的地步。呵呵,记得不是很清楚了。当然,这类问题可能对使用C语言的不同的人可能有不同的意义,有些人可能一辈子都不会遇到和想到,有人可能刚开始用C时就接触和理解了。不过我觉得把这个当成一个问题提出来是一个很好的态度。说出自己的见解也是一个很好的态度。
    说实话,在这个论坛里我喜欢那些好为人师的人,也许正是因为有他们在,这里才有一点人气(虽然他们也有说错的时候)。
    总之,学习了。

使用特权

评论回复
8
一般首席| | 2014-7-2 12:42 | 只看该作者
哈哈 学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝