目录
前言
紧接着上一篇有关指针(上)的详解,指针(下)的详解也新鲜出炉了,请小伙伴们好好品尝哦!
6.函数指针数组
数组是一个存放相同数据类型数据的存储空间,在指针(上)一节中,大家已经学习了指针数组,比如:
//数组的每个元素是int *
int*arr[10];
那要把函数的地址存到一个数组中,那么这个数组就叫函数指针数组,那函数指针该如何定义呢?请看下面这段代码,小伙伴们快来判断一下吧!
int (*parr1[10])( );
int *parr2[10]( );
int (*) ( )parr3[10]
相信聪明的小伙伴们已经猜到了答案是parr1。parr1先与【】结合,说明parr1是数组,那么数组的内容是什么呢,是int(*)()类型的函数指针。
那么函数指针数组有什么用途呢,答案就是转移表
接下来以计算器这个功能的实现来具体应用一下函数指针数组。
/简易整型计算器的实现
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a/b;
}
void menu()
{
printf("**** 计算器 ****\n");
printf("****1.add 2.sub ****\n");
printf("****3.mul 4.div ****\n");
printf("**** 0.exit ****\n");
printf("*********************\n");
}
//不使用函数指针
int main()
{
int a = 0;
int b = 0;
int input = 0;
int ret = 0;
do
{
menu();
printf("请选择功能;>");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个整形操作数;>");
scanf("%d %d", &a, &b);
switch (input)
{
case 1:
printf("%d\n", add(a,b));
break;
case 2:
printf("%d\n", sub(a, b));
break;
case 3:
printf("%d\n", mul(a, b));
break;
case 4:
printf("%d\n", div(a, b));
break;
}
}
else if (input != 0)
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
//使用函数指针
int main()
{
int a = 0;
int b = 0;
int input = 0;
int ret = 0;
int (*fac[5])(int x, int y) = { 0,add,sub,mul,div }; //转移表
do
{
menu();
printf("请选择功能;>");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个整形操作数;>");
scanf("%d %d", &a, &b);
printf("%d/n", (fac[input])(a, b));
}
else if (input != 0)
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
通过上面两种方式对于简易计算器的程序书写,我们发现函数指针数组确实会给我们书写某些代码的时候带来一定的便利和效率。
7.指向函数指针数组的指针
首先我们要明确,指向函数指针数组的指针是一个指针
这个指针指向的是一个数组,数组的元素都是函数指针
那么该如何定义呢?请看下面代码。
void test(const char* str)
{
printf("%s\n",str)
}
int main()
{
//函数指针pfun
void (*pfun)(const char*)=test
//函数指针的数组pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0]=test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[5])(const char* str)=&pfunArr;
return 0;
}
8.回调函数
回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件大声时由另一方调用的,用于对该事件或条件进行响应。 具体的代码实现会在下一节的模拟实现qsort函数中体现,千万不要错过哦!
小纸条
希望看到这里的兄弟们可以点点赞,走走关注,相互学习,一起进步呀!
1056

被折叠的 条评论
为什么被折叠?



