c语言知识点————函数指针

最近对C语言的指针进行复习,对函数指针进行总结。

函数指针(指向函数的指针)

定义函数指针变量的方式有三种:

第一种:
先定义函数类型,根据类型定义指针变量。

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

int fun(int a)
{
	printf("a ========== %d\n", a);

	return 0;
}

int main(void)
{

	//typedef int FUN(int a);
	typedef int FUN(int); //形参a可以去掉
	FUN *p1 = NULL;
	p1 = fun;
	fun(5);//传统调用函数的方法
	p1(6);//函数指针调用的方法
	system("pause");
	return 0;
}

运行结果:
c语言知识点————函数指针_第1张图片
可以看出这种方法,是通过typedef 定义了一个结构类型,通过指针p1指向函数fun。这种方法不常用。

第二种:
先定义函数指针类型,根据类型定义指针变量(常用)

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

int fun(int a)
{
	printf("a ========== %d\n", a);

	return 0;
}

int main(void)
{
	//typedef int(*PFUN)(int a);//PFUN是函数指针类型 形参a可以去掉
	typedef int(*PFUN)(int);//PFUN是函数指针类型
	PFUN p2 = fun;
	fun(7);//传统调用函数的方法
	p2(8);//函数指针调用的方法
	system("pause");
	return 0;
}

运行结果:
c语言知识点————函数指针_第2张图片

第三种:
直接定义函数指针(常用)

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

int fun(int a)
{
	printf("a ========== %d\n", a);

	return 0;
}

int main(void)
{
	//int(*p3)(int a) = fun;//形参a可以去掉
	int(*p3)(int) = fun;
	p3(9);
	system("pause");
	return 0;
}

运行结果:
c语言知识点————函数指针_第3张图片

函数指针的应用:

回调函数

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 

int add(int a, int b)
{
	return a + b;
}

//17:11
int minus(int a, int b)
{
	return a - b;
}

//函数的参数是变量,可以是函数指针变量吗?
//框架,固定变量, 17:10
//多态, 多种形态,调用同一接口,不一样表现
void fun(int x, int y,  int(*p)(int a, int b) )
{
	printf("fun11111111\n");

	int a = p(x, y); //回调函数 add(1,2)
	printf("a = %d\n", a);
}

typedef int(*Q)(int a, int b); //函数指针类型
void fun2(int x, int y, Q p)
{
	printf("fun11111111\n");

	int a = p(x, y); //回调函数 add(1,2)
	printf("a = %d\n", a);
}


int main(void)
{
	//fun(1, 2, add);

	fun2(10, 5, minus);

	printf("\n");
	system("pause");
	return 0;
}

运行结果:

c语言知识点————函数指针_第4张图片

如有错误,欢迎指出。

你可能感兴趣的:(c知识点)