c语言中不同的结构体类型的指针间的强制转换详解

c语言中不同的结构体类型的指针间的强制转换详解

ID:32534595

大小:47.20 KB

页数:3页

时间:2019-02-11

c语言中不同的结构体类型的指针间的强制转换详解_第1页
c语言中不同的结构体类型的指针间的强制转换详解_第2页
c语言中不同的结构体类型的指针间的强制转换详解_第3页
资源描述:

《c语言中不同的结构体类型的指针间的强制转换详解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在结构体中的偏移地址。      变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位值,并且存储在某个内存单元中,通过这个32位值就能找到param所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用

2、,param->bIsDisable只是这种引用更易读的写法,只要param是指向PAINT_PARAM的指针,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要记住,param->bIsDisable只是代表了对param一定偏移地址的值。     不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器param变量就是指向一个PAINT_PARAM结构体的变量并且指明了param的值,机器码的眼中是没有数据结构一说的,它只是机械的按照指令的要求从内存地址取值,那刚才的例子来

3、说,peg->x,peg->y的引用无论0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。 举个例子:typedefstruct_eg {     intx;     inty; }eg; intpoint=0x30000000; eg*peg=(eg*)point;可以看到point本身只是个整型变量,但是这样的赋值是合法的,peg->x

4、的值是0x30000000开始的四字节,peg->y是0x30000004开始的四字节 pMsg->wParam的值是0x30000000也就是param指向了以0x30000000为首地址的一片内存单元,这片内存单元以PAINT_PARAM的方式分布举个例子: typedefstructQueueNode{ structQueueNode*pNext;}tQueueNode; typedefstructQMSG{ tQueueNodeNode; tChatSysMsgdata; }tQMSG; typedefstructChatSysMsg{ int  Connfd

5、; char Version; char MsgType; char SerialNumber; int  MsgLen; char Msg[MAX_NUM_STR]; }tChatSysMsg; 它们间的强制转换:tQMSG*pTempMsg;(tQueueNode**)&pTempMsg;&pTempMsg->data   也就是(tChatSysMsg*)&pTempMsg->data;

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。