CONTAINING_RECORD macro之研究

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                                  (PCHAR)(address) - \
                                                  (UINT_PTR)(&((type *)0)->field)))

也就是:

#define CONTAINING_RECORD(address, type, field)  \

                                                    ((type *) ( (PCHAR)(address) - (UINT_PTR)(&((type *)0)->field)))

 

按我的理解

       该宏用于,知道某个结构中某个数据成员的地址(PCHAR)(address)

       然后在该地址的基础上减去该结构到上面的某个数据成员内存地址的偏移量(列如Ox0004 地址到 Ox0008地址,偏移量就是4),就得到了该结构的地址.                偏移量(UINT_PTR)(&((type *)0)->field)

列如

     typedef struct _TEST
{
 int a;
 int b;
}TEST,*PTEST;
int main()
{
 TEST *p1;
 TEST *p2;

 TEST *p3;
 p1=new TEST;
 p1->a=10;
 p1->b=20;
 p2=CONTAINING_RECORD(&p1->b,TEST,b);
 cout<<p2->a<<endl;
 cout<<p2->b<<endl;

p2->a=100;

p2->b=1000;

p3=CONTAINING_RECORD(&p1->a,TEST,a);

cout<<p3->a<<endl;

cout<<p3->b<<endl;  //p2,p3,p1都指向同一个地址
 return 0;
 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值