首先,我们来看看函数指针的定义
int (*f) (int x); /*声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
(*f)(x);/*调用f指向的func函数*/
接下来,我们再看函数指针一维数组
int (*f[5])(int x) =//定义了5个函数指针,这5个指针地址在初始化后可以修改
{
func0,
func1,
func2,
func3,
func4
};
int (const *f[5])(int x)//定义了5个函数指针,这5个指针地址在初始化后不可修改,
//f编译后存放在flash可以节约ram资源
{
func0,
func1,
func2,
func3,
func4
};
在实际的应用中,经常会使用“事件-响应”模式去编程,比如,用户按下运行键机器运行,按下停止键机器停止。对应从用户界面分别传下来参数0和1。这时就会分别执行func0执行运行命令,func1执行停机命令。
我们再看函数指针二维数组
//状态-事件函数
void (*const OpTranTable[MEMU_ALL][KEY_ALL+1])(void) =
{
//PRG RUN UP DOWN Shift LOCAL OK STOP 没有事件
/*MEMU_000*/ MEMU_000_PRG, MEMU_000_RUN, MEMU_000_UP, MEMU_000_DOWN, MEMU_000_NUL, MEMU_000_LOCAL, MEMU_000_OK, MEMU_000_STOP, MEMU_000_NOKEY,
/*MEMU_001*/ MEMU_001_PRG, MEMU_000_RUN, MEMU_001_UP, MEMU_001_DOWN, MEMU_000_NUL, MEMU_000_LOCAL, MEMU_001_OK, MEMU_000_STOP, MEMU_000_NUL,
/*MEMU_002*/ MEMU_001_PRG, MEMU_000_RUN, MEMU_002_UP, MEMU_002_DOWN, MEMU_002_SHIFT,MEMU_000_LOCAL, MEMU_002_OK, MEMU_000_STOP, MEMU_000_NUL,
/*MEMU_003*/ MEMU_001_PRG, MEMU_000_RUN, MEMU_003_UP, MEMU_003_DOWN, MEMU_003_SHIFT,MEMU_000_LOCAL, MEMU_003_OK, MEMU_000_STOP, MEMU_003_NOKEY,
/*MEMU_004*/ MEMU_004_NUL, MEMU_004_NUL, MEMU_004_NUL, MEMU_004_NUL, MEMU_004_NUL, MEMU_004_NUL, MEMU_004_NUL,MEMU_004_NUL, MEMU_004_NOKEY,
/*MEMU_005*/ MEMU_005_PRG, MEMU_000_RUN, MEMU_005_UP, MEMU_005_DOWN, MEMU_000_NUL, MEMU_000_LOCAL, MEMU_000_OK, MEMU_000_STOP, MEMU_005_NOKEY,
/*MEMU_006*/ MEMU_005_PRG, MEMU_000_RUN, MEMU_006_UP, MEMU_006_DOWN, MEMU_006_SHIFT,MEMU_000_LOCAL, MEMU_006_OK, MEMU_000_STOP, MEMU_006_NOKEY,
};
在实际应用中,会遇到在不用状态发生不同事件需要不同的响应函数,“当前状态-事件-响应函数”。比如在不同的界面按下不同的键响应函数也不同。
2272

被折叠的 条评论
为什么被折叠?



