Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161200
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 317
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-04 12:49
个人简介

专注于服务器开发技术

文章分类

全部博文(34)

文章存档

2015年(5)

2014年(29)

我的朋友

分类: C/C++

2014-09-02 20:25:59

#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的地址

拆解

点击(此处)折叠或打开


  1. #define list_entry(ptr, type, member) \
  2. ((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.
阅读(1549) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~