一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者blog.csdn.net/chuxinchang…
- 掘金LV3用户 juejin.cn/user/138142…
- 阿里云社区专家博主,星级博主,技术博主 developer.aliyun.com/profile/exp…
- 华为云云享专家 bbs.huaweicloud.com/community/m…
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)所代表的就是函数指针所指向的值,也就是函数本身,这样调用自然不会有问题。有兴趣的同学可以去试一试。