将0强转为指针的一种用法

写程序,有时为了方便,需要将0强转为指针,进行操作, 其中一种用法,为用来获取某个成员在对象中的offset, 以方便后续的其它操作


例子: 

  typedef  struct

{

      int  id;

      int  age;

}people;

//根据 对象中的某一个成员(element)获取其在对象中的偏移

#define offset(obj, element)    (long)(&((obj*)0)->element)

//根据对象中某个成员的地址, 获取其对应对象的地址

#define GET_OBJ_FORM_ELEMENT(p_element,obj,element)       ((obj*)((char *)(p_element) - (long)(&((obj *)0)->element)))


int main()
{
    people* lili = new people;
    lili->_id = 1;
    lili->_age = 23;
    int offs = offset(people, _age);
    cout << offs <<endl;


    people* hanmeimei = GET_OBJ_FORM_ELEMENT(&(lili->_age), people, _age);
    cout << hanmeimei->_id << " " <<hanmeimei->_age <<endl;
    return 0;
}

输出结果:  4

                       1  23


工作中的一个应用:

 DLINK 为一个双循环链表的头指针

任何定义的结构 struct 只要把DLINK作为其一个成员,即可将多个struct 串成双链表(通过操作DLINK),而不需要为每种struct都自己定义prev & next指针来串成链表,方便做到扩展。 同时还可根据&DLINK, 来获取其对应的对象的指针。操作双链表时,也是通过DLINK来操作。一般将DLINK作为对象的第一个成员。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值