一、函数指针
什么是函数指针呢?
其实就是指向函数的指针就叫函数指针
int main()
{
int x = 5;
int y = 10;
int a = 5;
int b = 5;
int ret = Add(x, y);
//p是函数指针,指向的函数是两个整形参数,返回值为整数
int(*p)(int x, int y) = Add;//函数名就是函数的地址
//int(*p)(int x, int y) = &Add;
int sum = p(a,b);//利用指针来调用函数
printf("%d\n",ret);
printf("%d\n",sum);
printf("%p\n", Add);
printf("%p\n", &Add);
printf("%p\n", p);
return 0;
}
下面是运行结果:
如果将int(*p)(int x,int y)写成了int*p(int x,int y)
这样的写法是不对的根据优先级会变成这样
(int*)p(int x,int y)这样的意思就是
函数名为p它的参数是两个整型,返回值为整数指针
二、函数指针数组
首先我们要是到函数指针数组到底是什么?函数?指针?数组?
其实函数指针数组是数组,这个数组里面放的类型相同的函数指针,下面看我们代码分析
//首先我们创建三个类型相同的函数
void function1()
{
printf("function1\n");
}
void function2()
{
printf("function2\n");
}
void function3()
{
printf("function3\n");
}
int main()
{
//创建函数指针数组,并将相应的地址赋值给指针
void(*functionarry[])() = { function1,function2,function3 };
functionarry[0]();//调用第一个函数
functionarry[1]();//调用第二个函数
functionarry[2]();//调用第三个函数
return 0;
}
三、加减乘除计算器
我们利用上面学的函数指针数组来模拟一个计算器
void sheet()
{
printf("1.ADD\n");
printf("2.SUB\n");
printf("3.MUL\n");
printf("4.DIV\n");
printf("0.EXIT\n");
}
int ADD(int x, int y)
{
return x + y;
}
int SUB(int x, int y)
{
return x - y;
}
int MUL(int x, int y)
{
return x * y;
}
int DIV(int x, int y)
{
return x / y;
}
int main()
{
int (*operation[4])(int, int) = { ADD,SUB,MUL,DIV };
int sel_oper = 0;
int operand_1 = 0;
int operand_2 = 0;
do
{
sheet();//首先我们选择需要运算的类型
printf("请输入要选择的运算:");
scanf_s("%d", &sel_oper);
if ((sel_oper >= 1) && (sel_oper <= 4))//这里条件是为了防止输入错误
{
printf("请输入操作数:");
scanf_s("%d %d", &operand_1, &operand_2);
int ret = operation[sel_oper - 1](operand_1, operand_2);
//使用函数指针数组,将选择的结果直接赋值为数组下标,在输入操作数
printf("结果是:%d\n", ret);
}
else if(sel_oper==0)
{
printf("退出计算器\n");
}
else
{
printf("选择错误,请重新选择\n");
}
printf("\n");
} while (sel_oper);
return 0;
}
四、指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素是函数指针。
int ADD(int x, int y)
{
return 0;
}
int main()
{
//首先我们创建一个函数指针
int (*p)(int, int);
//创建一个函数指针数组,包含5个函数指针
int (*parry[5])(int, int);
//将函数指针数组第一个函数指针拿出来,将ADD的地址给它
parry[0] = ADD;
//指针pparry指向了int(*()[5])(int,int)函数指针数组
// 有5个函数指针,函数的输入是两个整型,返回值是整型。
int (*(*pparry)[5])(int, int) = &parry;
return 0;
}
五、回调函数
回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
//回调函数实现例子
//实现f(x)=X^2+2X+1
int function1(int x)
{
return x * x;
}
int function2(int y)
{
return 2 * y;
}
int function3(int x,int y,int(*p1)(int), int(*p2)(int))//回调函数
{
int sum = p1(x) + p2(y) + 1;
return sum;
}
int main()
{
int a = 3;
int ret = function3(a, a, function1, function2);//函数名就是函数地址
printf("%d", ret);
return 0;
}