找回密码
 注册
搜索
查看: 805|回复: 4

[讨论] 关于指针相加出现的结果

[复制链接]
发表于 2008-8-14 18:42:05 | 显示全部楼层 |阅读模式
今天在看代码时看到两处代码,效果一样,可是后者涉及到指针的相加,所以不大理解,发个帖子学习下
   
     typedef volatile unsigned short* VP_U16
     #define                FLASH_BASE_ADDR        0x0000

     *((VP_U16)FLASH_BASE_ADDR + 0x555) 和*((VP_U16)(FLASH_BASE_ADDR+0x555*2))
      
     因为BB是A[1~21]连接到flash 的A[0~20],所以BB的地址需要左移后才是flash需要的地址,上面后一句代码很明白
    前一句就模糊了,按照同事和我说的是因为VP_U16 强制转化后,0x555也按照VP_U16 类型进行了加,所以效果和后一句相当,这里相加不就是相当于两个指针在加吗?指针相加不是没有意义吗?
    我的理解就算是有意义,也只是0x0000转化为SHORT类型的指针,与0x555相加后也不过是0x555地址啊。怎么变成0x555*2了呢
发表于 2008-8-18 09:24:52 | 显示全部楼层
在第一句中,0x555作为偏移量,我们可以理解为偏移0x555
个unsigned short;这样跟第二句的意思就是一样的
点评回复

使用道具 举报

 楼主| 发表于 2008-8-18 14:02:12 | 显示全部楼层
可是实际的效果就是第一局的作用是 偏移量= 0x555*2,这点不解
点评回复

使用道具 举报

发表于 2008-8-18 14:13:03 | 显示全部楼层
第一个的意思是以FLASH_BASE_ADDR开始,第0x555 + 1个unsigned short的数值,即指针指向地址为
(FLASH_BASE_ADDR + 0x555) * sizeof(unsigned short)的unsigned short值;
第二个是以FLASH_BASE_ADDR + 0x555 * 2为地址的unsigned short值;
因为sizeof(unsigend short)的值为2,而FLASH_BASE_ADDR的值为0,所以两条语句结果是一样的.
当FLASH_BASE_ADDR不为0时这两条指针所指向的地址就不同了.
从使用指针的安全性来讲,第一条语句的用法要优于第二条.
点评回复

使用道具 举报

 楼主| 发表于 2008-8-18 16:25:10 | 显示全部楼层
谢谢楼上的,明白了
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-29 08:44 , Processed in 0.044875 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表