#define list_entry(ptr, type, member)
原理:
指针ptr向结构体type成员member,根据ptr的值,获取type结构的起始地址。
解释:
ptr:指向type结构的成员member的指针;
type:包含list_head类型成员的父结构,形如下图结构;
member:type结构的成员member,类型为list_head;
typedef struct xxx{
...
list_t member
...
}type;
type* item;
type a;
list_t *ptr;
ptr = &a.member;
item = list_entry(ptr,type,member);
结果:item指向a的地址
拆解:
-
#define list_entry(ptr, type, member) \
-
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
步骤一:(char*)(ptr)
ptr是指向类型为type的某结构体中的成员member的指针,强制转换char*类型为了使得指针操作步长为一个字节
步骤二:&((type *)0)->member
(type*)0将段基址0强制转换为指针类型type*,然后取member成员的地址,再强制转换unsigned long.
也就是:member域相对于type结构基地址的偏移字节数。
两者相减后在强制转换为type*,即得type结构变量a的起始地址。
结束语:
list_entry的实现操作表面看起来复杂,令人眩晕,原理却简单质朴,进一步加深理解了指针。
参考:
1.http://blog.chinaunix.net/uid-29587692-id-4391367.html
2.
阅读(1585) | 评论(0) | 转发(0) |