关于指向数组成员的成员指针的疑惑~~~

mylzw 2005-12-10 09:22:56
我之前发了个帖子,解决了指针成员指向一个数组成员的时候该如何访问的问题:
http://community.csdn.net/Expert/topic/4450/4450238.xml?temp=.1471521

现在,又出来了个小疑惑~~~

int (IntArray::* pa)[26]=&IntArray::arr; //pa是指向数组成员的成员指针
cout<<(a.*pa)[1]<<endl; //使用符合语义的方法访问,运行时出现内存非法访问错误。
cout<<(*(&(a.*pa)))[1]<<endl; //是用这种看似无聊的操作,先&再*,却可正常访问。

(a.*pa)[1]和(*(&(a.*pa)))[1]不等价么?

期待着英雄的出现。。。。。。。。。。
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinlvchina 2005-12-11
  • 打赏
  • 举报
回复
1:我觉得C++对于类里面指向数组的指针成员,若直接用它访问指向的数组成员,
应该是:(a.pa)[1],就可以了吧.不是常规的(a.*pa)[1].

2:而cout<<(*(&(a.*pa)))[1]<<endl;却不是通过指针直接访问,而是访问数组(a.*pa)的地址再取值.

各位指正.
oyljerry 2005-12-11
  • 打赏
  • 举报
回复
用编译器等,单步调试看内存等
mylzw 2005-12-11
  • 打赏
  • 举报
回复
原来如此啊,让我郁闷了两天,谢谢大家。
James0001 2005-12-11
  • 打赏
  • 举报
回复
sorry, 用的是 vc.net 2k3
James0001 2005-12-11
  • 打赏
  • 举报
回复
刚才试了一下,在 vc.net 2k5 上没问题。编译器BUG?
双杯献酒 2005-12-11
  • 打赏
  • 举报
回复
VC6.0 有异常
VC2003 7.1.3091 正常,
估计是编译器Bug.
mylzw 2005-12-11
  • 打赏
  • 举报
回复
楼上的兄弟,你说的方法(a.pa)[1]。我测试过了,编译错误,提示找不到类的成员pa
如果用a.pa编译器会认为你要调用的是一个成员,而不是成员指针了。

我觉得语义正确的就是(a.*pa)[1]这种语法了。
a.*pa代表的应该就是这个数组的首地址,然后再根据偏移取值。
但是实践证明,这样老是运行时错误,非要饶个圈子!

不知道在别的编译器或别的平台是怎样的。

我个人猜测,假设a.*pa位于内存的x地址,那么x中保存的是一个数组成员的首地址。
但是由于某种原因,只能读取x这块地址的值,而不能写,并且不能对x使用*x间接寻址。
但是对x进行*&x后,得到的临时变量是可以间接寻址的,所以*((*&x)+1)可以得到偏移为1的内容,等价于(*&x)[0],等价于(*&(a.*pa))[0]

以上纯属猜测虚构啊~~ ;)
皮皮鲁 2005-12-10
  • 打赏
  • 举报
回复
的确很奇怪,我调试时发现pa的内容是0x00000000,而另外一个指向指针成员的指针pp则等于0x00000018,

当然这两个变量因为没有绑定到具体的对象上面去,出现本来应该是非法的地址也是可以理解的
但是为什么一个是0,一个是0x18就令人费解,还有为什么引用pa会出现访问违例,而只有用搂住所说的*(&(a.*pa))这么奇怪的语法才可以正常运行,奇怪,真是奇怪

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧