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

来源:互联网 发布:逆战神枪手源码 编辑:程序博客网 时间:2024/05/16 19:23

写程序,有时为了方便,需要将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作为对象的第一个成员。 

0 0