指向函数指针数组的指针&&回调函数的使用
【摘要】 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)