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

【强制结构体指针类型转换】访问成员变量 不同的数据类型如int,float,double以及我们通过结构体struct自己创建的数据类型,在内存所占的空间是不一样的。例如int型占四个字节,在内存的读取方式为从首地址开始读取32位的数据。 强制类型转换可以理解为首地址不变,我们把其读取方式改变。来看这样一个例子,通过这个例子可以对结构体内数据存储方式以及强制类型转换有更直观的认识。 #include<iostream> using namespace std; struct Str { int a=10; int b 阅读详情

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。

一.

结构体声明如何内存的分布,
结构体指针声明结构体的首地址,
结构体成员声明该成员在结构体中的偏移地址。

 

      变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位值,并且存储在某个内存单元中,通过这个32位值就能找到param所指向的结构的起始地址,通过这个起始地址和各个结构所包含变量离起始地址的偏移对这些变量进行引用,param->bIsDisable只是这种引用更易读的写法,只要param是指向PAINT_PARAM的指针,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要记住,param->bIsDisable只是代表了对param一定偏移地址的值。

      不是说某个地址有那个结构体你才能引用,即使没有,你也能引用,因为你已经告诉了编译器param变量就是指向一个PAINT_PARAM结构体的变量并且指明了param的值,机器码的眼中是没有数据结构一说的,它只是机械的按照指令的要求从内存地址取值,那刚才的例子来说,peg->x,peg->y的引用无论0x30000000是否存在一个eg结构体都是合法的,如果0x30000000开始的8个字节存在eg结构体,那么引用的就是这个结构体的值,如果这个位置是未定义的值,那么引用的结果就是这8个字节中的未定义值,内存位置总是存在的,而对内存中值的引用就是从这些内存位置对应的内存单元取值。

 

举个例子 :


typedef struct_eg
{
     int x;
     int y;
}eg;
int point = 0x30000000;
eg *peg = (eg*)point;

可以看到point本身只是个整型变量,但是这样的赋值是合法的,peg->x的值是0x30000000开始的四字节,peg->y是0x30000004开始的四字节
pMsg->wParam 的值是0x30000000也就是param指向了以0x30000000为首地址的一片内存单元,这片内存单元以 PAINT_PARAM 的方式分布


举个例子:

 

typedef struct QueueNode
{
 struct QueueNode * pNext;
}tQueueNode;

 

typedef struct QMSG
{
 tQueueNode Node;
 tChatSysMsg data;
 
}tQMSG;

 

typedef struct ChatSysMsg
{
 int  Connfd;
 char  Version;
 char  MsgType;
 char SerialNumber;
 int  MsgLen;
 char Msg[MAX_NUM_STR]; 
}tChatSysMsg;

 

它们间的强制转换:

tQMSG * pTempMsg;
(tQueueNode **)&pTempMsg;
&pTempMsg->data    也就是 (tChatSysMsg *)&pTempMsg->data;

【C语言】把一个结构体指针转换为另一个结构体指针 可以把结构体Peo的指针转换为 Stu 类型的指针。 阅读详情

相关推荐

HBuilderx 坑 之前没问题 改了几行代码 小程序上传报分包大小超过限制

Error: 分包大小超过限制,main package source size 4199KB exceed max limit 2MB [20221213 10:08:06][wx432abdb518bdc1eb]下面的我提示是都没超过2M,却提示我超过限制,代码改了不到20行吧,之前是正常上传的.....,比如这类,要压缩的,前提是没压缩过的,但是我肯定提交的时候是压缩的,没勾选此项的要注意,如果本文解决了你的困扰 来波666不为过吧!

爱就码上行动,奔赴热爱,追光而行。愿你带着从容与热爱,拥抱每一天的惊喜与美好 5219

强制转换为结构体指针的例程

#include "stdafx.h" struct stu                 //定义机构体 { char num;  char parry[10]; }; int main() { char a[10]="adcadcgh";//把a数组拿来做实验 struct stu * pt;                //定义一个结构体指针 pt =

我的博客 4421

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文详细介绍了如何在PHP项目中快速集成SM4国密加密算法,提供完整的代码实现和实际应用示例。从算法原理到核心代码解析,再到性能优化与安全实践,帮助开发者高效实现数据加密功能,满足金融、政务等领域的合规需求。

weixin_29315569的博客 354

C语言技巧--结构体指针的强制转换

C语言技巧--结构体指针的强制转换

帅不啦叽斯基的博客 5627

【UOJ170】Picks loves segment tree VIII

【题目链接】 点击打开链接 【前置阅读】 【BZOJ4695】最假女选手 【BZOJ3064】【TYVJ1518】CPU监控【UOJ169】【UR #11】元旦老人与数列 【思路要点】 前置阅读中的前两题中,我们分别对线段树的区间取最大/最小值和线段树的历史最大/最小值进行了研究。本题中,两类问题同时出现,因此我们

cz_xuyixuan的博客 1247

2019年电赛D题《简易电路特性测试仪》全过程

2019年全国大学生电子设计大赛D题《简易电路特性测试仪》硬件部分及故障分析

zzhao2580的博客 5万+

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

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布,结构体指针声明结构体的首地址,结构体成员声明该成员在结构体中的偏移地址。变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位...

weixin_26858217的博客 615

[GXYCTF2019]BabyUpload1 -- .htaccess文件解析与蚁剑实战指南

本文深入解析了[GXYCTF2019]BabyUpload1文件上传漏洞的实战利用。通过绕过后缀名与内容检测,上传包含PHP代码的.jpg文件,并利用.htaccess文件强制服务器将其解析为PHP脚本。文章详细介绍了.htaccess的原理、构造方法、Content-Type绕过技巧,并演示了如何使用中国蚁剑连接Webshell获取Flag,为Web安全学习提供了完整实战指南。

weixin_29016315的博客 509

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

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布,结构体指针声明结构体的首地址,结构体成员声明该成员在结构体中的偏移地址。变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位...

weixin_42367233的博客 588

超融合架构实战:如何用3节点搭建企业级分布式存储系统?

本文详细介绍了如何利用3节点搭建企业级分布式存储系统的超融合架构实战指南。从硬件选型、网络配置到存储策略调优,提供了全面的实操建议和性能优化技巧,帮助企业实现高效、弹性的IT基础设施。特别适合需要简化运维、提升存储性能的中型企业参考。

weixin_29200485的博客 325

【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真

1.软件版本 MATLAB2010b 2.本算法理论知识 对短波信道建模具有里程碑意义的是沃特森在1970年发表的一篇文章,文章中提出了一种静态模型,并在大气中进行了实验验证。 此静态模型可以描述为高斯散射增益抽头延迟线模型,即Watterson模型。 Watterson信道模型是经典的窄带短波信道模型,在这个模型中,信道衰落是瑞利幅度分布,而在每种传播模式中多普勒扩展的功率谱满足高斯分布。Watterson模型没有定义延时扩展的形状,认为各个多径传输模式中不存在延时扩展。其...

FPGA/MATLAB学习教程/源码/项目合作开发 2757

c语言指针char类型转换,【转】C语言中不同的结构体类型的指针间的强制转换详解...

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布,结构体指针声明结构体的首地址,结构体成员声明该成员在结构体中的偏移地址。变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位...

weixin_36474795的博客 891

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

ChatGPT辅助课题申报书研究背景部分的写作全过程指南

智能AI让学术科研更容易 2554

c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解 (转发)...

C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险。只要理解了其内部机制,你会发现C是非常灵活的。一.结构体声明如何内存的分布,结构体指针声明结构体的首地址,结构体成员声明该成员在结构体中的偏移地址。变量的值是以二进制形式存储在内存中的,每个内存字节对应一个内存地址,而内存存储的值本身是没有整型,指针,字符等的区别的,区别的存在是因为我们对它们有不同的解读,param的值就是一个32位...

weixin_35879493的博客 430

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言指针强制类型转换

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a;  float b;

mhjcumt的专栏 14万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c语言指针强制类型转换

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; (假设它们所占的字节分别是4、8、8、10,而且连续存储于某个

赵凯月的博客 9496

结构体类型的指针的强制转换

结构体和int等类型一样,都是数据类型。其他类型怎么转换,结构体就怎么转换,没有什么特殊的地方。 楼主可能想知道的不是结构体怎样强制转换这个问题吧,猜测,楼主想知道如下几个问题: 如果将一个结构体强制类型转换为另一个结构体(或者类型),那这个结构体的成员会怎样了? 如果将一个结构体强制类型转换为另一个结构体(或者类型),那么这个结构体成员的数值又会是什么了? 解答: 1、结构体的本质是:

kokodudu的专栏 3万+

C语言结构体与结构体指针的使用

C语言结构体与结构体指针的使用 tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识 c语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。说的通俗一点就是一个集合。c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有点异曲同工之处了。下面回归正题,学习一下结构体以及结构体指针的知识。 一、结构体变量的定义和初始化 1、首先我们来看一下结构体的定义 struct 结构体名 { 成员列表; }

wrlovesmile的博客 8万+

C语言 结构体指针强制转换,c中结构体指针的强制类型转换

1、结构体到结构体指针之间的转换a、结构体指针的强制类型转换即结构体的数据成员在内存段当中的重新分配,结构体的存储“内存对齐”请参看上篇博客,该论述实例如下:#include #include struct A{int num;};struct B{int num;char type;int age;};int main(){struct A a;a.num = 5;char* tmp1 = (c...

weixin_42506706的博客 5101

C语言类型转换-自动类型转换、强制类型转换、指针类型转换

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。 自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如: float f = 100; 100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如: int n = f; f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。 在赋值运算中,

qq_41854911的博客 8151

c语言指针强制类型转换的应用

指针的强制类型转换可以灵活的对单个和多个字节的数据结构进行操作

j5856004的博客 1万+

C语言结构体类型的强制转换

当所用到的各个层次的成员较多时,我们会定义多个结构体函数,但是在传输过程中我们需要具体的指定哪一个结构体作为传输的数据,又C语言中的结构体并不能直接进行强制类型转换,只有结构体的指针可以进行强制类型转换,因此中间涉及到指针的问题,也就涉及到指向空间地址的问题。 我们定义一个结构体如下: typedef struct stdudent { char name[20]; i...

qq_37082966的博客 3724
上一篇: NFS 文件系统源代码剖析
下一篇: Makefile编写
JuliusRyan
博客等级 码龄19年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值