指向函数指针数组的指针&&回调函数的使用

246 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情


大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:


15.指向函数指针数组的指针

int arr[10];
int(*p)[10] = &arr;	//p是一个指向整形数组的指针

int* arr[10];
int* (*p)[10] = &arr;	//p是一个指向整形指针数组的指针

int Add(int x,int y)
{
    return x+y;
}
int(*pf)(int,int) = Add;	//pf是函数指针,指向的函数的返回类型为int,有两个参数,一个为int,一个为int
int(*pfArr[5])(int,int);//pfArr是一个函数指针的数组,(pfArr先和[]结合,是数组),去掉数组名和元素个数->int(*)(int,int) 所以元素是函数指针
int(*(*ppfArr)[5])(int,int) = &pfArr;	//ppfArr先和*结合->指针  此时ppfArr就是一个指向函数指针数组的指针, *ppfArr == pfArr,,*ppfArr相当于拿到了pfArr数组的数组名,去掉数组名和元素个数->元素类型,-> int(*)(int,int) 所以ppfArr指向的数组的元素类型为函数指针类型

 函数指针->函数指针数组->指向函数指针数组的指针
//技巧:在函数指针数组的数组名前加*号,然后用括号括起来,这样就是指针了

16.回调函数的概念

1.回调函数是什么

回调函数是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

  • 回调函数就是一个通过函数指针调用的函数
  • 回调函数一般通过函数指针实现
  • 回调函数一般不是函数的实现方调用,而是在特定的场景下,由另外一方调用
  • 回调函数是调用函数指针指向的函数

17.使用回调函数设计简易计算器


基本框架

void menu()
{
	printf("*********************\n");
	printf("**1.add   2.sub******\n");
	printf("**3.mul   4.div******\n");
	printf("**0.exit       ******\n");
	printf("*********************\n");
}
enum Option
{
	EXIT,	//0
	ADD,	//1
	SUB,	//2
	MUL,	//3
	DIV,	//4
};
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入你的选择->:");
		scanf("%d", &input);
		switch(input)
		{
		case ADD:
			Calc(Add);
			break;
		case MUL:
			Calc(Mul);
			break;
		case DIV:
			Calc(Div);
			break;
		case SUB:
			Calc(Sub);
			break;
		case EXIT:
			printf("退出成功\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
		
	} while (input);
	return 0;
}

Calc函数的参数是加减乘除函数的地址,Calc函数参数使用函数指针接收

枚举的成员值从0开始,所以可以使用枚举对应用户的选项,这样编写程序的时候更直观


加减乘除函数

int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	if (y == 0)
	{
		printf("被除数不能为0,运算出错,自动返回-1\n");
		return -1;
	}
	return x / y;
}

回调函数

//Calc函数的参数是一个函数指针
void Calc(int(*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数:>");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	//也可以写成: ret = (*pf)(x,y);
	printf("运算结果为:%d\n", ret);
}

通过Calc函数调用函数指针指向的函数

pf是函数指针 *pf == 函数 == pf 地址值: 函数名 == &函数名

(pf有能力接收函数的地址-> 说明pf == 函数) ,(pf存放函数的地址-》*pf即为调用该函数)


  调用的时候,既可以直接使用函数指针调用,也可以通过函数指针所指向的值去调用。
 (*p)所代表的就是函数指针所指向的值,也就是函数本身,这样调用自然不会有问题。有兴趣的同学可以去试一试。