一,概念
函数指针:指向函数的指针变量,本质上是一个指针变量,指向的是一个函数
指针函数:顾名思义就是带有指针的函数,即其本质是一个函数,只不过这种函数返回的是一个对应类型的地址,即返回的是一个指针。
二,定义
函数指针: type (*func)(type , type ),如 void (*func)(void),定义一个指向void类型的指针变量。
指针函数: type *func (type , type),如 int *func(void),定义一个返回int型的指针函数。
三,代码演示
1,指针函数
#include <stdio.h>
int*fun(int *a)
{
return a;
}
int main(int argc, char **argv)
{
int a = 3;
printf("%d", *(fun(&a)));
return 0;
}
2,函数指针
①最简单的一种函数指针形式:
#include <stdio.h>
typedef int (*Func)(int); //声明指针
Func func;
int fun(int i)
{
return i + 1;
}
int main(int argc, char **argv)
{
int r;
func = fun; //给指针赋值
r = (*func)(5); //调用
printf("%d\n", r);
return 0;
}
typedef的功能是定义新的类型,第2句就是定义了一种Func的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回int类型。后面就可以像使用int,char一样使用Func了。
②函数指针数组的应用:
#include "stdio.h"
double app_add(double a,double b)
{
return a+b;
}
double app_sub(double a,double b)
{
return a-b;
}
/*函数指针数组申明*/
double (*app_func[])(double, double) = {
app_add,app_sub
};
int main(int argc, const char * argv[])
{
int oper = 0;
int op1 = 5;
int op2 = 8;
int result = app_func[oper](op1,op2); //oper=0调用app_add函数;oper=1调用app_sub函数。
printf("%d",result);
return 0;
}
③函数指针结构体与数组的应用:
typedef void (*App_Func)(void);
typedef struct {
App_Func app_func1;
App_Func app_func2;
} tApp_t;
enum {
MODE_IDLE = 0,
MODE_INIT,
MODE_MAX
};
const tApp_t Tab[MODE_MAX]=
{
/*IDLE*/
{
app_idle_fun1,
app_idle_fun2
},
/*INIT*/
{
app_init_fun1,
app_init_fun2
},
};
void app_idle_fun1()
{
}
void app_idle_fun2()
{
}
void app_init_fun1()
{
}
void app_init_fun2()
{
}
int main (void)
{
Tab[MODE_IDLE ].app_idle_fun1(); //调用app_idle_fun1函数
return 0;
}