OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5999|回复: 4

C语言结构类型转换,发现自己没办法理解了~~~恳请大神拍醒~~~

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2015-11-29 23:23:14 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#endif /* SO_REUSE */ lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN); /*lwip??????????tcp_pcb_listen?á??????ר???è??LISTEN×????????á????*/ if (lpcb == NULL) { return NULL; } lpcb->callback_arg = pcb->callback_arg; /*??tcp_pcb????????±???tcp_pcb_listen????*/ lpcb->local_port = pcb->local_port; lpcb->state = LISTEN; /*?è?????ì??×???*/ lpcb->prio = pcb->prio; lpcb->so_options = pcb->so_options; ip_set_option(lpcb, SOF_ACCEPTCONN); lpcb->ttl = pcb->ttl; lpcb->tos = pcb->tos; ip_addr_copy(lpcb->local_ip, pcb->local_ip); if (pcb->local_port != 0) { TCP_RMV(&tcp_bound_pcbs, pcb); /*tcp_bound_pcbs(??°ó?¨?ê±?????±í),??tcp_bound_pcbs??±í???????????ì*/ } memp_free(MEMP_TCP_PCB, pcb); /*??·?????????*/ #if LWIP_CALLBACK_API lpcb->accept = tcp_accept_null; /*???????§???????????????÷????*/ #endif /* LWIP_CALLBACK_API */ #if TCP_LISTEN_BACKLOG lpcb->accepts_pending = 0; lpcb->backlog = (backlog ? backlog : 1); #endif /* TCP_LISTEN_BACKLOG */ TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);/*如何理解这里的结构类型转换???*/ return (struct tcp_pcb *)lpcb; }[/mw_shl_code]
按照小弟的理解:这里的lpcb指针已经被初始化了,它的类型是struct tcp_pcb_listen *,如何将它强制转换为struct tcp_pcb *,毕竟2者所指向的变量所占用的内存空间不同~
恳请大神拍醒我.......

最佳答案

查看完整内容[请看2#楼]

或者说:如何理解结构体之间的强制类型转换~ 例如:struct a { char a; }; struct b { int a; char b; } 它们之间如何进行指针强制转换呢? struct b B = {0x12345678,0x9A}; struct a * pA = (struct a*)(&B); 这个时候就可以用结构体a的格式来访问(看待)结构体b的实体数据, (例如小端模式下,pA->a的值为0x78) 强制类型转换只是变换了对 ...
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-29 23:23:15 | 显示全部楼层
或者说:如何理解结构体之间的强制类型转换~
例如:struct a
{
char a;
};

struct b
{
int a;
char b;
}
它们之间如何进行指针强制转换呢?

struct b B = {0x12345678,0x9A};
struct a * pA = (struct a*)(&B);
这个时候就可以用结构体a的格式来访问(看待)结构体b的实体数据, (例如小端模式下,pA->a的值为0x78)

强制类型转换只是变换了对数据的看法,原始的数据不会变化,这样能给我解析数据很多方便。
比如
struct x
{
    int X;
};

struct Y
{
    short int Y1;
    short int Y2;
};

struct Z
{
    char Z1;
    char Z2;
    char Z3;
    char Z4;
};

struct X Test = {0x12345678};
如果我想检查一个int型变量的最高位字节,
那((struct Z*)Test)->Z4就能得到。
((struct Z*)Test)->Z1就能得到低位

其实用union更方便。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2015-11-29 23:35:57 | 显示全部楼层
或者说:如何理解结构体之间的强制类型转换~
例如:struct a
{
char a;
};

struct b
{
int a;
char b;
}
它们之间如何进行指针强制转换呢?恳请大神指教~
电子爱好者
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-11-29 23:44:48 | 显示全部楼层
具体要看结构体定义。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2015-12-1 10:30:22 | 显示全部楼层
回复【4楼】ianhom:
---------------------------------
感谢大神赐教
电子爱好者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 17:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表