巧妙的offset

#define   offsetof(s,m)   (size_t)&(((s   *)0)-> m)
 
  然后到网上查了一下,发现还真的是很有用,附带一位大侠的解说:

    struct       AAA      
    {      
    int       i;      
    int       j;      
    };      
       
    struct   AAA   *pAAA;      
    pAAA=new   AAA;      
    这时,pAAA实际上是一个Pointer,   指向某一确定的内存地址,比如0x1234;      
    而   pAAA-> i   整体是一个int型变量,其地址是&(pAAA-> i)   , '& '为取址运算符;      
    那么&(pAAA-> i)一定等于0x1234,因为i是结构体AAA的第一个元素。      
    而&(pAAA-> j)一定是0x1234   +   0x4   =   0x1238;   因为sizeof(int)   =   4;
       
    这个做法的巧妙之处就是:它把“0”作为上例中的pAAA,那么   &(pAAA-> j)就是j的      
    offset啦

    解析结果是:      
    (s       *)0   ,将   0   强制转换为Pointer   to       "s "          
    可以记   pS   =   (s   *)0   ,pS是指向s的指针,它的值是0;      
    那么pS-> m就是m这个元素了,而&(pS-> m)就是m的地址,而在本例中就是offset啦      
       
    再把结果强制转换为size_t型的就OK   了,size_t其实也就是int啦!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值