打印

C51: 指向指针的指针

[复制链接]
2496|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuocong|  楼主 | 2010-3-22 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大哥好!

小弟在调试51时,keil报出一个警告,拿出来给大家会诊下:

将程序贴出来先:
void main(void)
{
unsigned char idata **PPt;
unsigned char idata temp;
  temp = 0x06;
  PPt = &temp;
  *(*PPt) =0x55;
   while(1);
}

笔者希望能操作任一数据RAM,上述程序将D:0x06的内容修改为0x55.
用keil编译后,出现警告,但调试后仍然达到预期目的。

警告为:
warning C182: pointer to different objects
出现在“  PPt = &temp;”这一行。

笔者认为: (*PPt)是指向unsigned char型的指针变量。
               PPt是指向何种类型的指针变量,缺没有定义,所以会造成这种情况。

请教各位该怎样修改,才可以消除这个警告,谢谢!

相关帖子

沙发
gz04022167| | 2010-3-22 17:19 | 只看该作者
PPt = &temp;------->*PPt = &temp;

使用特权

评论回复
板凳
liang7143| | 2010-3-24 11:01 | 只看该作者
本帖最后由 liang7143 于 2010-3-24 11:13 编辑

修改如2楼所示:
PPt = &temp;------->*PPt = &temp;

之所以为什么会达到预期效果,鄙人是这么认为的:
temp = 0x06;
PPt = &temp;
--------->
那么,*PPt = *(&temp) = 0x06;这里绕了一个弯,相当于这样赋值变量:
unsigned char a;
*(&a) = 0x01;

*(*PPt) = 0x55; 这里发生了一次强制转换。相当于这样的效果:
(unsigned char idata*)(0x06) = 0x55;

使用特权

评论回复
地板
liang7143| | 2010-3-24 11:09 | 只看该作者
如果使用强制转换的话,楼主可以这样修改:

void main(void)
{
unsigned char idata temp;
  temp = 0x06;
  (unsigned char idata*)(temp) =0x55;
   while(1);
}

使用特权

评论回复
5
zhuocong|  楼主 | 2010-3-25 10:35 | 只看该作者
谢谢“gz04022167”和“liang7143”两位的帮忙!
如二位所说,做这个修改“PPt = &temp;------->*PPt = &temp;
”,确实可以消除警告。但却达不到预定目的。

二位不妨一试。
(unsigned char idata*)(temp) =0x55;这条语句仍然修改temp的值。

使用特权

评论回复
6
ShakaLeo| | 2010-3-25 11:05 | 只看该作者
temp = 6;
*(unsigned char idata *)temp = 0x55;
就可以了。
楼主的程序出现警告的原因:PPt的类型并不是指向何种类型的指针变量,而是指向指针的指针变量 ,&temp的类型是unsigned char * ,不是同一个类型的指针。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhuocong + 1
7
hgjinwei| | 2010-3-25 19:50 | 只看该作者
ARM 是这样操作外设的:
*(__IO uint32_t *)0x40000000 = 0x00;
可以参考一下。

PPt = &temp;------->*PPt = &temp;
改后不仅改变了程序的意图,
还有可能使系统崩溃,原因:
PPT值未知,执行
*PPt = &temp;
后天知道它会将“temp”的地址送到哪。

使用特权

评论回复
8
zhuocong|  楼主 | 2010-3-25 21:30 | 只看该作者
谢谢shakaLeo的答复,如你的回答可以解决我遇到的问题,并且temp和PPt不再绑定,比较容易维护。

使用特权

评论回复
9
lenglx| | 2010-3-25 23:11 | 只看该作者
1)
如果只是要通过指针设定RAM的内容,貌似一层指针就可以了
unsigned char idata *PPt;
unsigned char idata *temp;
temp = 0x06;
PPt = temp;
*PPt =0x55;

2)如果真需要2层指针
unsigned char idata **PPt;
unsigned char idata *temp;
temp = 0x06;
PPt = &temp;
*(*PPt) =0x55;

3)可以使用typedef使之容易阅读点
typedef unsinged char idata * IPTR;

IPTR * PPt;
IPTR temp;
temp = 6;
PPt = &temp;
**PPt = 0x55;

使用特权

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

本版积分规则

8

主题

26

帖子

1

粉丝