c 语言的15个晦涩,一条晦涩难懂的C语言语句

问题描述:

一条晦涩难懂的C语言语句

我在一个函数中看到的

struct ylist_head *i;

struct ylist_head *n;

yaffs_Object *l;

...

//有这么一条语句

l = ylist_entry(i,yaffs_Object,siblings);

//其中siblings是结构体yaffs_Object中的成员

//这条语句调用的是一个宏,如下

#define ylist_entry(entry,type,member) \

((type *)((char *)(entry)-(unsigned long)(&((type *)NULL)->member)))

二楼的解释得很好,但还是不太明白,我还想问,为什么要这么做呢?这么做有什么好处呢?为什么不直接将member的地址直接赋给l呢?如:l = &entry->member,希望二楼的在给予解答!

1个回答

分类:

综合

2014-12-02

问题解答:

我来补答

&((type *)NULL)->member

如果把0看作指向type的指针,那么 type::member的地址是这个

(unsigned long)(&((type *)NULL)->member)

把这个地址转成unsigned long ,因为指向整个对象的指针本身是0,所以这个值实际上就是member 这个成员在结构里的位置偏移量

(char*)(entry)就是为了让它在加减1的时候内存地址实际上也是加减1

(char*)(entry) - (unsigned long)(&((type *)NULL)->member)

就是从entry这个位置减去member的偏移量.

它的意义是:如果entry是指向某个type结构对象的member成员的指针,那么这个结果就是这个结构对象0偏移位置的指针,也就是指向这个对象整体的指针.

外头再加个类型转换就很容易理解了,因为里头算出来的就是指向整个对象的指针,所以也就转换成type*

总的来说,如果 entry是指向某个type类型对象的member成员的指针,这个宏可以求得指向这个对象的指针

展开全文阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值