有关强制转换的问题?

yang0622 2002-04-03 04:59:50
什么类型的指针可以强制转换成什么样的指针,有什么规则?
例如:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} , *PBITMAPINFO;
PBITMAPINFO pInfo;
BITMAPINFOHEADER(pInfo)的强制转换为什么是合法的?
...全文
36 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Robin_Hood_POT 2002-04-03
  • 打赏
  • 举报
回复
就是我说的原则啊

假设pInfo指向内存地址 A

那么pInfo指向的PBITMAPINFO变量存放在内存中地址A开始到A + sizeof(PBITMAPINFO) - 1结束

根据C++规定,第一个声明的成员变量排列在前面,也就是bmiHeader在内存中占据了从地址A 到 地址A + sizeof(BITMAPINFOHEADER) - 1结束,然后是bimcolors

pInfo指向地址A,你将之转换为BITMAPINFOHEADER类型的指针当然是对的,因为确实是一个BITMAPINFOHAEDER类型的对象在地址A吗!

不知道你明白没有?
yang0622 2002-04-03
  • 打赏
  • 举报
回复
可是我上面的例子为什么是合法的呢?指针被强制转换成了它的结构里面的一个成员.为什么?
Robin_Hood_POT 2002-04-03
  • 打赏
  • 举报
回复
指向的对象没有变(如果你没有进行任何改变指向对象的数据的操作的话)

改变的是你的指针类型所对应的操作集合!
Robin_Hood_POT 2002-04-03
  • 打赏
  • 举报
回复
是的,指针指向的不过是一块内存地址,关键是转换后,如果你转换后的指针类型的操作集合能够对指向的内存合法的进行操作,就可以了!

如果基类指针实际指向的是派生类对象,明明知道,但是不能调用派生类的函数,那么就可以强制转换!

yang0622 2002-04-03
  • 打赏
  • 举报
回复
那么转换后的指针所指的对象是否变了呢?是怎么变的呢?
load 2002-04-03
  • 打赏
  • 举报
回复
据我的理解,指针是双字节(DWORD)的,任何指针都是可以转换的,关键是你转换后的指针怎么来用的问题,指针所指向数据结构一定要了解才能正确使用这个指针。

不知这话对你有没有用?

16,467

社区成员

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

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

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