目录
函数指针数组---数组存放的是函数
---指针存放的是函数的地址
- #define _CRT_SECURE_NO_WARNINGS
- #include
- int Add(int x, int y)
- {
- return x + y;
- }
- int Sub(int x, int y)
- {
- return x - y;
- }
- int main()
- {
- int (*pf1)(int, int) = &Add;
- int (*pf2)(int, int) = ⋐
- int (*pfArr[4])(int, int) = { &Add,&Sub };
- //*pfArr存放函数指针的数组
- //*pfArr[4]有4个元素,每个元素都是一个函数指针
- return 0;
- }
看下面的代码
case里面的语句,有好多重复
就可以利用函数指针数组去让下面的代码变得更简洁
- void menu()
- {
- printf("******************************\n");
- printf("*** 1.Add 2.Sub ***\n");
- printf("*** 3.Mul 4.Div ***\n");
- printf("*** 0.Exit ***\n");
- printf("******************************\n");
- }
- 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)
- {
- return x / y;
- }
- int main()
- {
- int input = 0;
- int x = 0;
- int y = 0;
- int ret = 0;
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- printf("请输入2个操作数:");
- scanf("%d %d", &x, &y);
- ret = Add(x, y);
- printf("ret = %d\n", ret);
- break;
- case 2:
- printf("请输入2个操作数:");
- scanf("%d %d", &x, &y);
- ret = Sub(x, y);
- printf("ret = %d\n", ret);
- break;
- case 3:
- printf("请输入2个操作数:");
- scanf("%d %d", &x, &y);
- ret = Mul(x, y);
- printf("ret = %d\n", ret);
- break;
- case 4:
- printf("请输入2个操作数:");
- scanf("%d %d", &x, &y);
- ret = Div(x, y);
- printf("ret = %d\n", ret);
- break;
- case 0:
- printf("退出程序!\n");
- break;
- default:
- printf("选择错误!\n");
- break;
- }
- } while (input);
- return 0;
- }
代码改进之后
会使多余的代码删除
在 ret = pfarr[input](x, y); 中如果输入的input 是 1 ----->则进入Add的函数中,将x,y的值传到Add函数中,返回x+y,输入其他数字同理,要注意的是input的值必须(>=1且<=4)
- void menu()
- {
- printf("******************************\n");
- printf("*** 1.Add 2.Sub ***\n");
- printf("*** 3.Mul 4.Div ***\n");
- printf("*** 0.Exit ***\n");
- printf("******************************\n");
- }
- 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)
- {
- return x / y;
- }
- int main()
- {
- int input = 0;
- int x = 0;
- int y = 0;
- int ret = 0;
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- //函数指针数组
- int (*pfarr[])(int, int) = { NULL,Add,Sub,Mul,Div };
-
- if (0 == input)
- {
- printf("退出程序!\n");
- }
- else if (input >= 1 && input <= 4)
- {
- printf("请输入2个操作数:");
- scanf("%d%d", &x, &y);
- ret = pfarr[input](x, y);
- printf("ret = %d\n", ret);
- }
- else
- {
- printf("选择错误,请重新选择!\n");
- }
- } while (input);
- return 0;
- }
上述代码展示,如下图

指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
- int main()
- {
- int a = 10, b = 20 , c = 30;
- int* arr[] = { &a,&b,&c };
- //整型指针数组
- int* (*p)[3] = &arr;
- //p是指针,是指向整形数组的指针
-
-
-
- //函数指针数组,存放的是函数的地址
- int(*pfArr[5](int, int) = { NULL,Add,Sub,Mul,Div };
- //pfArr是函数指针数组
- int (*(*p)[5])(int, int) = &Arr;
- // *p 是指针,指向数组,有5个元素
- // p 就是一个能够指向函数指针数组的指针
- }
向函数指针数组 pfArr 的指针 p 就是一个能够指向函数指针数组的指针
( 博主在这里插一嘴,可以继续套娃哦)
回调函数就是一个通过函数指针调用的函数
如果你把指针(地址)作为参数传给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
回调函数不是由该函数的实践方直接调用,而是在特定的事件或条件发生发生时由另外的一方调用的,用于该事件或条件进行响应
代码演示,用回调函数实现计算器(上面的代码):
- void menu()
- {
- printf("******************************\n");
- printf("*** 1.add 2.sub ***\n");
- printf("*** 3.mul 4.div ***\n");
- printf("*** 0.exit ***\n");
- printf("******************************\n");
- }
- 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)
- {
- return x / y;
- }
- void calc(int (*pf)(int, int))
- {
- int x = 0;
- int y = 0;
- int ret = 0;
- printf("请输入2个操作数:");
- scanf("%d%d", &x, &y);
- ret = pf(x, y);
- printf("ret = %d\n", ret);
- }
- int main()
- {
- int input = 0;
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- calc(Add);
- break;
- case 2:
- calc(Sub);
- break;
- case 3:
- calc(Mul);
- break;
- case 4:
- calc(Div);
- break;
- case 0:
- printf("退出程序!\n");
- break;
- default:
- printf("选择错误!\n");
- break;
- }
- } while (input);
- return 0;
- }
代码展示:
- void print_arr(int* arr, int sz)
- {
- int i = 0;
- for (i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
- }
-
- void bubble_sort(int arr[], int sz)
- {
- int i = 0;
- for (i = 0; i < sz - 1; i++)
- {
- int j = 0;
- for (j = 0; j < sz - 1 - i; j++)
- {
- if (arr[j] > arr[j + 1])
- {
- int tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- }
- }
- }
- }
-
- int main()
- {
- int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- print_arr(arr, sz);//排序前
- bubble_sort(arr, sz);
- print_arr(arr, sz);//排序后
- return 0;
- }
注意 : 这个函数只能排序整形类型
- void qsort(void* base, //待排序数组的第一个元素的地址
- size_t num, //待排序数组的元素个数
- size_t size,//待排序数组中一个元素的大小
- int (* cmp)(const void* e1, const void* e2)//函数指针-cmp指向了一个函数,这个函数是用来比较两个元素的
- e1和e2中存放的是需要比较的两个元素的地址
- );
- //1. 排序整型数组, 两个整型可以直接使用>比较
- //2. 排序结构体数组,两个结构体的数据可能不能直接使用>比较
- 也就是不同类型的数据,比较出大小,方法是有差异的
qsort() 是 C语言的一个标准库函数,定义在头文件中。
qsort() 函数用于对数组进行快速排序,它是一个通用的排序函数,支持对不同类型的元素进行排序。
qsort() 函数的原型如下:
void qsort (void *base , size_t nitems , size_t size , int (*compar ) ( const void *, const void* ) );
欲知后事如何,请听下章分解
新人博主,如果有地方解释的不对或者不清晰,麻烦大佬们海涵,如果可以麻烦从评论区指出,我一定会加以修改,万分感谢
最后麻烦大佬们动一下发财的小手一键三连,千万分感谢