函数指针
一个函数在编译时被分配一个入口地址,函数名代表函数的入口地址,可以定义一个指针,保存函数的入口地址,该指针就是一个函数指针。
函数指针的定义
// 1 直接定义函数指针
// int fun(int a,int b) 先定义函数
// *p 定义一个指针(指针类型先不关心)
// 最后用指针替换函数名,并完成赋值
int (*p)(int a,int b) = fun
// 2 先定义函数类型,再根据函数类型定义函数指针(不常用)
typedef int FUN(int,int) // 给int (int a,int b)函数类型取别名叫FUN
FUN *P = fun; // 用函数类型定义函数指针并完成赋值
// 3 先定义函数指针类型,再根据函数指针类型定义函数指针
typedef int (*FUN)(int,int) // 定义函数指针类型 int (*)(int,int)
FUN p = fun; // 用函数指针类型定义函数指针并完成赋值
函数指针的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void fun01(int a)
{
printf("%d\n",a*10);
}
void fun02(int a)
{
printf("%d\n", a * 100);
}
void fun03(int a)
{
printf("%d\n", a * 1000);
}
typedef void(*FUN123)(int a);
int main()
{
// 定义了一个数组,数组有3个元素,每个元素都是函数指针类型,即函数指针数组
FUN123 p[3] = {fun01,fun02,fun03};
for (int i = 0; i < sizeof(p)/sizeof(p[0]); i++)
{
// 打印结果0 100 2000
// 实现了通过函数指针调用函数
p[i](i);
}
system("pause");
return 0;
}
回调函数:函数的参数中有函数指针做为参数,则该函数称为回调函数,回调函数可以将函数的调用和函数的实现有效的分离
typedef int(*Q)(int a, int b); //Q 为函数指针类型
// 用函数指针类型Q定义了函数指针变量p作为fun函数的形参
// 此时函数指针p还没有具体的指向,即p指向的函数还没有实现却已经可以通过p来调用
void fun(int x, int y, Q p)
{
int a = p(x, y);
printf("a = %d\n", a);
}