结构体互相指向,一般有以下应用场景。最主要的是不要误认为结构体互相指向是"箱中箱"(网上真有这样认知的)。
1、相互回溯,一一对应关系
struct A 和 struct B逻辑关系式一一对应。典型的如page和button,main menu和sub menu。
● page 和 button
#define MAX_BUTTON_NUM 8
struct _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
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实现"对象"