函数指针的定义与使用

函数指针

一个函数在编译时被分配一个入口地址,函数名代表函数的入口地址,可以定义一个指针,保存函数的入口地址,该指针就是一个函数指针。

函数指针的定义

// 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
#include
#include
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);
}

你可能感兴趣的:(指针)