一. 函数指针,指针函数是什么
1. 指针函数
指针函数,首先它是一个函数,并且它的返回值是一个指针。形如:
// 返回值为整型指针类型
int* fun2()
{
int* p = (int*)malloc(sizeof(int));
return p;
}
2. 函数指针
它是指针,指向函数的指针,形如:
// 函数名代表了函数的入口地址
int fun(int a)
{
printf("fun()被调用");
}
void main()
{
// 从结合律看 第一个()代表了它是一个指针,第二个()代表了它指向函数
// 所以pF是一个指向返回值为整型,参数列表中含有一个整型参数的函数
int(*pF)(int a);
pF = fun; // 函数名代表了函数的入口地址
pF(1); // 通过函数指针调用函数
}
还可通过typedef对类型进行重定义,方法如下:
1). 先定义函数类型,根据类型定义指针变量
// 先定义函数类型,根据类型定义指针变量
// 有typedef是类型,没有是变量
typedef int FUN(int a); // FUN函数类型
FUN* p1 = NULL; // 函数指针变量(只能指向函数返回值为int类型,并且传入参数为一个参数的int类型的函数)
//p1 = &fun;
p1 = fun; // p1指向fun函数
fun(5); // 传统调用方法
p1(6); // 函数指针变量调用方法
2). 先定义函数指针类型,根据类型定义变量(常用)
typedef int (*PFUN)(int a); // PFUN,函数指针类型
PFUN p2 = fun; // p2 指向 fun
p2(7);
二. 函数指针的应用
1. 利用数组存放函数指针
此处不展示加减乘除函数的原理,仅对主函数中的思想进行展示。
如果利用普通格式对这些函数调用,则要利用到选择结构进行判断,此处提供另外一种思考方式。
// 同类型函数通过指针数组进行调用
int main()
{
// 函数指针数组
void (*fun[5])() = { add, minus, multi, divide, myeixt };
// 指针数组 存放函数名
char* buf[] = {"add", "min", "mul", "div", "exit"};
char cmd[100];
int i = 0;
while (1)
{
printf("请输入指令:");
scanf("%s", cmd);
for (i = 0; i < 5; i++)
{
// 与指针数组中的字符串进行对比
if (strcmp(cmd, buf[i]) == 0)
{
fun[i](); // 通过数组访问对应函数
break; // 跳出for
}
}
}
return 0;
}
2. 利用函数指针实现多态
我们通过在函数中的参数列表传入函数指针,通过传入的函数指针回调其他函数。来实现多态
#include <stdio.h>
#include <string.h>
int add(int a, int b)
{
return a + b;
}
int minus(int a, int b)
{
return a - b;
}
// 函数的参数是变量, 可以是函数指针变量吗?
// 多态,多种形态,调用同一接口,不一样的表现
void fun(int x, int y, int(*p)(int a, int b)/*函数指针,通过函数名传入函数入口地址,表示调用哪个函数*/)
{
printf("fun1111111\n");
int a = p(x, y); // 回调函数 add(1, 2) minus(10, 5);
printf("a = %d\n", a);
}
// 第二种定义形式
typedef int(*Q)(int a, int b); // 函数指针类型
void fun1(int x, int y, Q p)
{
printf("fun1111111\n");
int a = p(x, y); // 回调函数 add(1, 2) minus(10, 5);
printf("a = %d\n", a);
}
int main()
{
fun(1, 2, add);
fun(10, 5, minus);
fun1(2, 1, minus);
return 0;
}