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

举报
芒果_Mango 发表于 2022/03/28 10:34:00 2022/03/28
【摘要】 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是函数指针,指向的函数的返回类型为...

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)所代表的就是函数指针所指向的值,也就是函数本身,这样调用自然不会有问题。有兴趣的同学可以去试一试。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。