结构体互相指向
结构体互相指向,一般有以下应用场景。最主要的是不要误认为结构体互相指向是"箱中箱"(网上真有这样认知的)。
1、相互回溯,一一对应关系
struct A 和 struct B逻辑关系式一一对应。典型的如page和button,main menu和sub menu。
● page 和 button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #define MAX_BUTTON_NUM 8struct _guipage_;typedef struct _button_{ int x, y; int w, h; char *name; char *comment; struct _guipage_ *pGuiPage; bool visible; bool disable; buttontype_t type;}button_t;typedef struct _guipage_{ char *name; char *header; /*按钮*/ button_t *pButton[MAX_BUTTON_NUM]; int ButtonNum;}guipage_t; |
● main menu 和 sub menu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | struct T_Menu;//菜单项结构体 typedef struct T_MenuItem{ BYTE aucItemName[20]; //菜单项的内容 WORD32 dwItemIndex; //菜单项索引 struct T_Menu *ptParentMenu; //此菜单项所在的菜单 struct T_Menu *ptSubMenu; //菜单项链接的子菜单 SWORD32 (*pFunc)(); //该菜单项对应的功能函数指针 }T_MenuItem; //菜单结构体 typedef struct T_Menu{ BYTE aucMenuName[20]; //菜单的名字,居中显示 WORD32 dwItemNum; //菜单有多少项 WORD32 dwMenuIndex; //菜单索引 WORD32 dwItemXOffset; //菜单中各个菜单项显示的X轴的偏移 WORD32 dwCurItemIndex; //当前选中的菜单项索引 struct T_Menu *ptParentMenu; //上一级菜单 T_MenuItem atItem[40]; //菜单项 }T_Menu; |
此场景,struct A 和 struct B强调的是逻辑上的一一对应的主从关系。
2、抽象和具体
ffmpeg中这样的用法很多,可以参考本人的另一篇博客:c实现"对象"
sff

浙公网安备 33010602011771号