C 语言通过结构体成员获得结构体指针

本文介绍了C语言如何通过结构体成员获取结构体指针,这是C语言实现继承多态的关键。内容涉及offsetof函数的使用,以及通过成员变量地址和结构体类型计算结构体对象地址的技巧。注意成员变量名称和指针名字需一致,且成员变量地址应为结构体中的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过结构体成员拿到结构体的指针,是C语言实现继承多态的基础。面向对象C编程可以参看这里OOC 面向对象C语言编程实践。这里详细介绍这个核心的操作方法。

/**
 * Get struct pointer from member pointer
 */
#define StructFrom2(memberPtr, structType) \
	((structType*) ((char*) memberPtr - offsetof(structType, memberPtr)))


下面给出一个使用的例子。

typedef struct Drawable Drawable;  
struct  Drawable  
{  
     float positionX;  
     float positionY;  
};  

typedef struct Sprite Sprite;  
struct  Sprite  
{  
    Drawable drawable[1];  
};  

Sprite sprite[1];

Drawable* drawable = sprite->drawable;

Sprite* sprite = StructFrom2(drawable, Sprite);  

我们需要传入成员变量的地址和结构体类型。这样,首先使用offsetof标准库函数,获得这个成员变量的偏移量。在利用成员变量指针减去这个偏移量,就拿到了这个结构体对象的地址。这里有两个注意的地方。


第一,这里成员变量的名称,要和成员指针名字一致。因为offsetof参数需要的是成员变量名字。例子中drawable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值