我们来分析一个函数指针的案例1
首先area.h文件中进行定义
typedef void (*fDataManage)(int iAreaSign); //fDataManage等价于类型 int (*)(int),int (*)(int)是类型名,fDataManage是别名
typedef struct kpMac_Area_Unit
{
int iAddrOffset;
unsigned char btVal;
unsigned char btMask;
}Mac_Area_Unit;
typedef struct kpMAC_AREA
{
Mac_Area_Unit stMacAreaUnit[MAC_AREA_COUNT];
fDataManage pDataManage;
}MAC_AREA;
void SetDataManage(fDataManage p);
然后在area.c文件中需要进行变量初始化操作(将pDataManage 设置为NULL),并且对进行SetDataManage进行函数实现,设置要函数指针的具体值。
MAC_AREA g_stMacArea;
void InitMacArea()
{
....
for (i=0;i
然后可以在其他任意地方如(InitAxis.c)对函数进行调用(需要引入对应的头文件),并将AxisDataManage函数地址作为入参。
void InitAxis()
{
SetDataManage(AxisDataManage);
}
void AxisDataManage(int iLoc)
{
int i;
for (i=0;i
以上的都是对函数指针进行了设置与定义,没有真正执行函数指针所指定的函数,接下来需要执行函数指针的函数如下:
在area.c文件中对指针函数进行调用实现:
void TransferPulse()
{
...
for ( i = 0; i < MAC_AREA_COUNT; i++)
{
...
g_stMacArea.pDataManage(i);
...
}
}
案例2——一个结构体内定义多个函数指针
在Load.h文件中定义:
typedef void (*fSpecialAxisMoveSet)(DIGIT_CMD* pMacUser);
typedef void (*fSpecialOpParaSet)(int iLabel);
typedef int (*fAnalyseCmdData)(int iIndex,DIGIT_CMD* pMacUser);
typedef struct kpMAC_LOAD_MOVE_PARA
{
int iLoadIndex;
DIGIT_CMD stMacUser;
fAnalyseCmdData pAnalyseCmdData;
fSpecialAxisMoveSet pSpecialAxisMoveSet;
fSpecialOpParaSet pSpecialOpParaSet;
}MAC_LOAD_MOVE_PARA;
void InitMacLoadMovePara(fAnalyseCmdData pData,fSpecialAxisMoveSet pPara);
void SetOpPara(fSpecialOpParaSet p);
在Load.c文件中进行一个初始化操作
void InitMacLoadMovePara(fAnalyseCmdData pData,fSpecialAxisMoveSet pPara)
{
memset(&g_stMacLoad,0,sizeof(MAC_LOAD_MOVE_PARA));
g_stMacLoad.pAnalyseCmdData = pData;
g_stMacLoad.pSpecialAxisMoveSet = pPara;
}
在move.c文件初始化的使用执行了:
void InitMove()
{
...
InitMacLoadMovePara(AnalyseCmdData,SpecialAxisMoveSet);
...
}
int AnalyseCmdData(int iIndex,DIGIT_CMD* pMacUser)
{
...
}
void SpecialAxisMoveSet(DIGIT_CMD* pMacUser)
{
...
}
最后在Load.c文件中执行了指针函数
void LoadUnionMovePara()
{
g_stMacLoad.pAnalyseCmdData(int,&g_stMacLoad.stMacUser);
g_stMacLoad.pSpecialAxisMoveSet(&g_stMacLoad.stMacUser);
}
其实都一样,只是不同函数间的相互调用罢了。
参考:
C语言指针进阶(一)——深入详解“函数指针”与“指针函数”-CSDN博客