计算结构体内的成员所处的结构体的首地址
计算结构体成员在结构体内的地址编号(偏移值或差值)
type结构体名,mem结构体里某个成员名
结构体指针:(type*)0
结构体指针访问成员:((type*)0)->mem,拿到了里面的成员变量
加&是变为地址编号&((type*)0)->mem,此时为16进制
但是我们想要值,所以强转
变为整数值:(long)&((type*)0)->mem
注意:32位为int,64位为long
#define offset(type,mem) ((long)&((type*)0)->mem)
node为节点指针,type结构体名,mem结构体里某个成员名
node为成员地址 - offset为偏移值
节点地址:node
指针:(void*)node,(void*)也可以(char*)他们两个每次解引用都是一个字节
重新转换为type类型指针:(type*)((void*)node - offset),因为要访问的是结构体指针
最后外面套括号是对整个式子的保护
#define node_to_obj(node,type,mem) ((type*)((void*)node - offset(type,mem)))



