函数指针
2020-03-18 本文已影响0人
风情云
函数指针
函数指针就是指向函数的一个指针,函数名就是一个地址,定义一个指针指向函数体,此指针就是函数指针。
定义与使用
//定义一个函数
void func(void)
{
printf("error\n");
}
int main()
{
//第一种方法
typedef void F1(void);
F1 *f1 = func;
//第二种方法
typedef void (*F2)(void);
F2 f2 = func;
//第三种方法 (常用)
void (*f3)(void) = func;
//使用函数指针,也称为仿函数
f3();
return 0;
}
函数指针的定义与数组指针有点类似,也都是有三种方法。要注意指向函数体的返回值与形参列表,两者要一致,如果实现带形参的指针类型指向不带形参的函数体,语法没有错,但是,运行可能出错。所以要返回类型与形参列表要一致。
函数指针当作形参
void func(int n)
{
printf("n = %d\n",n);
}
//函数指针当作形参
void test(void (*f)(int),int n)
{
f(n);
}
int main()
{
void (*f)(int n) = func;
test(f,4);
return 0;
}
函数指针当作形参可以实现回调函数,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。该函数可以当作中间函数,中间函数自己并没有实现,而是调回其他函数来实现。
函数跳转表
#include <stdio.h>
#include <stdlib.h>
int add(int a,int b)
{
return a+b;
}
int subtract(int a,int b)
{
printf("%d\n",a-b);
return a-b;
}
int multiply(int a,int b)
{
return a*b;
}
void table()
{
//定义函数跳转表
//函数指针数组
int (*func[3])(int,int) = {add,subtract,multiply};
char ch[3] = {'+','-','*'};
printf("请输入运算\n");
int a,b;
char c;
scanf("%d%c%d",&a,&c,&b);
int i;
int num = sizeof(ch)/sizeof(ch[0]);
for(i=0;i<num;i++)
{
if(c == ch[i])
{
//使用跳转表
int l = func[i](a,b);
printf("%d\n",l);
break;
}
}
}
int main()
{
table();
return 0;
}
使用函数跳转表可以不需要i多层f else语句判断,看起来很凌乱,维护起来也比较麻烦,增加函数只需在跳转表登记函数名就可以,看起来也比较舒服。