有关指针的理解

eeeeelin 2018-08-19 04:31:30
最近小弟遇到了一个问题?
问题是这样的:

typedef struct {
uint8_t type;
uint16_t version;
uint16_t length;
uint8_t *protocol;
} __attribute__((packed)) a_header;

typedef struct {
uint32_t type : 8;
uint32_t length : 24;
uint8_t *payload;
} __attribute__((packed)) b_header;

a *a_hdr = (a_header *)packet; //packet为数据包
b_header *b_hdr = (b_header *)(&a_hdr->protocol);
if (b_hdr->type == MY_TYPE) {
return 1;
}
else {
return 0;
}

这段代码里

b_header *b_hdr = (b_header *)(&a_hdr->protocol);

为什么b_hdr要取a_hdr->protocol的地址,而不是

b_header *b_hdr = (b_header *)(a_hdr->protocol);

这个问题好纠结,望大神帮忙解析下,感激感激!
...全文
397 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-08-24
  • 打赏
  • 举报
回复
引用 10 楼 eeeeelin 的回复:
[quote=引用 9 楼 hdt 的回复:]
有什么不好理解的
一个指针其实就是32位的内存单元(32位程序下)。既然是32位内存单元,就可以放置32位数据。再结合两个字段一个8位,一个24位,大致已经可以猜出来了
一楼已经给出答案。
不理解的话,c++可以去重修了

我想知道为什么要这样用?不是理解指针是什么的问题[/quote]
问为什么之前,先考虑一下要干什么?如果这么做能满足结果。那这个为什么就是要满足结果。当然达到这个结果很可能有别的方式。
就好比,吃包子可以填饱肚子,吃馒头也可以,您能去问为什么要吃包子,不吃馒头?
eeeeelin 2018-08-24
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质,
而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

看来要学习下汇编了
eeeeelin 2018-08-24
  • 打赏
  • 举报
回复
引用 12 楼 hdt 的回复:
[quote=引用 10 楼 eeeeelin 的回复:]
[quote=引用 9 楼 hdt 的回复:]
有什么不好理解的
一个指针其实就是32位的内存单元(32位程序下)。既然是32位内存单元,就可以放置32位数据。再结合两个字段一个8位,一个24位,大致已经可以猜出来了
一楼已经给出答案。
不理解的话,c++可以去重修了

我想知道为什么要这样用?不是理解指针是什么的问题[/quote]
问为什么之前,先考虑一下要干什么?如果这么做能满足结果。那这个为什么就是要满足结果。当然达到这个结果很可能有别的方式。
就好比,吃包子可以填饱肚子,吃馒头也可以,您能去问为什么要吃包子,不吃馒头?[/quote]
我再研究下
真相重于对错 2018-08-23
  • 打赏
  • 举报
回复
有什么不好理解的
一个指针其实就是32位的内存单元(32位程序下)。既然是32位内存单元,就可以放置32位数据。再结合两个字段一个8位,一个24位,大致已经可以猜出来了
一楼已经给出答案。
不理解的话,c++可以去重修了
zhouqunhai 2018-08-23
  • 打赏
  • 举报
回复
楼上讲的研究很明白了
eeeeelin 2018-08-23
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
有什么不好理解的
一个指针其实就是32位的内存单元(32位程序下)。既然是32位内存单元,就可以放置32位数据。再结合两个字段一个8位,一个24位,大致已经可以猜出来了
一楼已经给出答案。
不理解的话,c++可以去重修了

我想知道为什么要这样用?不是理解指针是什么的问题
赵4老师 2018-08-22
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质,
而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

eeeeelin 2018-08-22
  • 打赏
  • 举报
回复
实在是理解不了
真相重于对错 2018-08-21
  • 打赏
  • 举报
回复
b_header *b_hdr = (b_header *)(&a_hdr->protocol);

b_header *b_hdr = (b_header *)(a_hdr->protocol);
两个是不一样的 ,上边的b_hdr 直接指向了 a_hdr->protocol
下边的,b_hdr指向了a_hdr->protocal指向的内存。
具体为什么,要看上下文。
AlbertS 2018-08-21
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
[quote=引用 4 楼 shihengzhen101 的回复:]
[quote=引用 3 楼 hdt 的回复:]
b_header *b_hdr = (b_header *)(&a_hdr->protocol);

b_header *b_hdr = (b_header *)(a_hdr->protocol);
两个是不一样的 ,上边的b_hdr 直接指向了 a_hdr->protocol
下边的,b_hdr指向了a_hdr->protocal指向的内存。
具体为什么,要看上下文。

感觉用法不对啊,b_header *b_hdr = (b_header *)(&a_hdr->protocol);指向一个指针有什么用呢,结果b_hdr 执行的内存里只保存了a_hdr->protocol这个变量的地址,取一个变量地址的前8个字节判断类型,貌似看不出有什么用啊[/quote]
不是8个字节,而是8位,同样不是24个字节,而是24
位[/quote]嗯嗯,改成位,貌似是没有意义的,因为这个地址是系统分配的,貌似用来判断是不对的
真相重于对错 2018-08-21
  • 打赏
  • 举报
回复
引用 4 楼 shihengzhen101 的回复:
[quote=引用 3 楼 hdt 的回复:]
b_header *b_hdr = (b_header *)(&a_hdr->protocol);

b_header *b_hdr = (b_header *)(a_hdr->protocol);
两个是不一样的 ,上边的b_hdr 直接指向了 a_hdr->protocol
下边的,b_hdr指向了a_hdr->protocal指向的内存。
具体为什么,要看上下文。

感觉用法不对啊,b_header *b_hdr = (b_header *)(&a_hdr->protocol);指向一个指针有什么用呢,结果b_hdr 执行的内存里只保存了a_hdr->protocol这个变量的地址,取一个变量地址的前8个字节判断类型,貌似看不出有什么用啊[/quote]
不是8个字节,而是8位,同样不是24个字节,而是24
AlbertS 2018-08-21
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
b_header *b_hdr = (b_header *)(&a_hdr->protocol);

b_header *b_hdr = (b_header *)(a_hdr->protocol);
两个是不一样的 ,上边的b_hdr 直接指向了 a_hdr->protocol
下边的,b_hdr指向了a_hdr->protocal指向的内存。
具体为什么,要看上下文。

感觉用法不对啊,b_header *b_hdr = (b_header *)(&a_hdr->protocol);指向一个指针有什么用呢,结果b_hdr 执行的内存里只保存了a_hdr->protocol这个变量的地址,取一个变量地址的前8个字节判断类型,貌似看不出有什么用啊
eeeeelin 2018-08-20
  • 打赏
  • 举报
回复
楼上能说得再明白谢吗?
zhn-csdn 2018-08-19
  • 打赏
  • 举报
回复
protocol 表面是指针类型,实际存放的不是内存地址,而是 type + length 。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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