#include
#include
void func1()
{
printf("Func1 is runing...\n");
}
void func2()
{
printf("Func2 is runing...\n");
}
void func3()
{
printf("Func3 is runing...\n");
}
void func4()
{
printf("Func4 is runing...\n");
}
void Temp_function() { printf("\nPlease input 1-4 to select test!!!\n"); }
struct //结构体数组
{
void (*fun)(void); // 函数指针
char *tip; // 字符串
}CmdTip[] = {
{ Temp_function, "Please input 1-4 to select test" } ,
{ func1, "Fun1" } ,
{ func2, "Fun2" } ,
{ func3, "Fun3" } ,
{ func4, "Fun4" } ,
{ 0, 0}
};
int main()
{
int i;
while(1)
{
unsigned char idx;
printf("\nPlease select function : \n");
for(i=0; CmdTip[i].fun!=0; i++)
printf("%d : %s\n", i, CmdTip[i].tip);
scanf("%hhu", &idx);
// printf("idx=%d; i=%d", idx, i);
if(idx
(*CmdTip[idx].fun)();
}
return 0;
}
回调函数的使用范例:
#include
typedef int(*FUNCTION)(int);
int g(int n, FUNCTION f)
{
int i = 0;
int ret = 0;
for(i=1; i<=n; i++)
{
ret += i*f(i);
}
return ret;
}
int f1(int x)
{
return x + 1;
}
int f2(int x)
{
return 2*x - 1;
}
int f3(int x)
{
return -x;
}
int main()
{
printf("x * f1(x): %d\n", g(3, f1));
printf("x * f2(x): %d\n", g(3, f2));
printf("x * f3(x): %d\n", g(3, f3));
}
实例分析(u-boot-2009.11/lib_arm/bootm.c):
//实例分析(u-boot-2009.11/lib_arm/bootm.c)
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
bd_t*bd = gd->bd;
char*s;
intmachid = bd->bi_arch_number;
// 声明一个函数指针 是第二图中 直接直接定义的一种
void(*theKernel)(int zero, int arch, uint params);
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
return 1;
// 为这个函数指针赋值 将images->ep强制转化为函数类型
theKernel = (void (*)(int, int, uint))images->ep;
cleanup_before_linux ();
// 调用这个函数 另一种方法:(*theKernel) (0, machid, bd->bi_boot_params);
theKernel (0, machid, bd->bi_boot_params);
/* does not return */
return 1;
}