版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35682844/article/details/84444995
定义
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
int (*fun)(int x,int y);
函数指针是需要把一个函数的地址赋值给它,有两种写法:
fun = &Function;
fun = Function;
取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。
实例
以下实例声明了函数指针变量 p,两个int类型参数,无返回值,指向Add、Decr、Multi、Div:
#include <stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
void(*p)(int x, int y);
void Add(int a, int b);
void Decr(int a, int b);
void Multi(int a, int b);
void Div(int a, int b);
int main()
{
int a, b;
char ch;
printf("请输入两个整数:\n");
scanf_s("%d%d", &a, &b);
ch = '+'; //改变运算符,会调用不同的程序
switch (ch)
{
case '+':
p = Add;
(*p)(a, b);
break;
case '-':
p = Decr;
(*p)(a, b);
break;
case '*':
p = Multi;
(*p)(a, b);
break;
case '/':
p = Div;
(*p)(a, b);
break;
default:
break;
}
return 0;
}
void Add(int a, int b)
{
printf("%d+%d=%d", a, b, a + b);
}
void Decr(int a, int b)
{
printf("%d-%d=%d", a, b, a - b);
}
void Multi(int a, int b)
{
printf("%d*%d=%d", a, b, a * b);
}
void Div(int a, int b)
{
printf("%d/%d=%d", a, b, a / b);
}
回调函数(函数指针作为某个函数的参数)
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数。
实例
showInfo(int a,int b,int (*p)(a,b))就是一个回调函数。第三个参数为函数指针。
#include <stdio.h>
void showInfo(int a, int b, int(*p)(a, b));
int Add(int a, int b);
int Decr(int a, int b);
int Multi(int a, int b);
int Div(int a, int b);
int main()
{
showInfo(5, 2,Add);
return 0;
}
void showInfo(int a, int b, int(*p)(a, b))
{
printf("%d", (*p)(a, b));
}
int Add(int a, int b)
{
return a + b;
}
int Decr(int a, int b)
{
return a - b;
}
int Multi(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
return a / b;
}