打印

C语言指针问题

[复制链接]
1701|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子乌托邦|  楼主 | 2010-9-25 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
st_MeterDpr *__MeterDpr;
st_MeterDpr Meters[4];
int tmp2;
tmp2 = (sizeof(st_MeterDpr))*4;

tmp1 = Meters + tmp2;

其中st_MeterDpr 是我定义的一个结构体;
Meters 的地址是0x200000A4
tmp2 运算后是  0x00000050
我希望得到的tmp1答案是0x200000A4+0x50 = 0x200000F4;
但tmp1 运算后是  0x200006E4
求教了!

相关帖子

沙发
HWM| | 2010-9-25 12:58 | 只看该作者
Meters是具有类型的常指针,其类型为st_MeterDpr。

Meters + tmp2 的实际值应该是 Meters + tmp2 * sizeof-st_MeterDpr。

可以看出,sizeof-st_MeterDpr 是 20。

使用特权

评论回复
板凳
armmage| | 2010-9-25 13:02 | 只看该作者
帅哥 你误解指针用法的细微之处了

指针?不就是地址么----一般菜鸟会这么说
你的tmp2想算什么我不管 貌似是结构体占内存长度 * 4
你让Meters + 0x50 就一定能得到 Meters 地址处向后数0x50个字节的地址么?
Meters 是指向某个结构体的指针 Meters + 1 可不是下一个字节的地址(除非你这个结构体就一个字节的成员) 所以 Meters + 1 可以理解为把Meters 看做一个普通数组 其实你定义的是结构体数组 没什么区别 那么数组名(可以理解为首指针) + 1 得到的是下个元素的地址 也就是 sizeof(st_MeterDpr)个字节后的地址
所以你让 Meters + 0x50 相当于你定义了一个 Meters[很大]的结构体数组 然后取到他的 第 0x50个 元素的地址 这个地址当然不是0x200000F4 为什么是0x200006E4呢?自己算下就知道了 补充一句 你这样用指针 很容易造成取到超出数组范围的地址 很危险的

使用特权

评论回复
地板
电子乌托邦|  楼主 | 2010-9-25 14:07 | 只看该作者
谢谢楼上两位
还是本人基础不够扎实,感谢!

使用特权

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

本版积分规则

140

主题

633

帖子

2

粉丝