常规的思维,建一个链表,都是想在节点构建某个对象的属性,而linux的链表相反,是在对象内添加链表属性。但是这样带来问题就是想通过(结构
元数)链表遍历每个节点很不方便,于是就有以下通过存储位置获取对象的宏:
-
struct list_head {
-
struct list_head *next, *prev;
-
};
-
-
/**
-
* list_entry - get the struct for this entry
-
* @ptr: the &struct list_head pointer.
-
* @type: the type of the struct this is embedded in.
-
* @member: the name of the list_struct within the struct.
-
*/
-
#define list_entry(ptr, type, member) \
-
container_of(ptr, type, member)
-
//这里通过menber成员获取type类型的结构对象的地址。ptr是member的实际的地址。
-
#define offsetof(TYPE,MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
/*通过该宏获取成员member在type中的偏移位置。(TYPE *)0 是把0地址转换为TYPE指针类型,然后从这个指针上“取”MEMBER成员再取址。
是骗编译器说有一个指向类(或结构)TYPE的指针,其值为0 ,这时MEMBER的地址当然就是MEMBER在TYPE中的偏移了 .
*/
-
#define LIST_HEAD_INIT(name) { &(name), &(name) }初始化链表的两个成员
-
-
#define LIST_HEAD(name) \
-
struct list_head name = LIST_HEAD_INIT(name)
-
-
static inline void INIT_LIST_HEAD(struct list_head *list)
-
{
-
list->next = list;
-
list->prev = list;
-
}
-
遍历链表例子:
-
struct student
{
int grade;
int unit;
char* name;
float shengao;
struct student *next;
};
static struct student *file_systems;
struct student** find_student_byname(char* name,unsigned len)
{
//p所指向的值也是一个指针,即p指向的值也是一个地址
struct student** p;
// for,中条件部分 (*p).当*p指向实际地址,满足条件、进循环。
for(p = &file_systems;*p; p = &((*p)->next))
{
if( strncmp(name,(*p)->name,len) == 0 && len == strlen((*p)->name))
{
break;
}
}
return p;
};
最近经常提不起精神!人家说种瓜得瓜,我这看的啥用哦!
阅读(1284) | 评论(0) | 转发(0) |