定义:函数指针放进数组中,就叫函数指针数组,准确的说,将一个函数的地址存到⼀个数组中
int (*pi[5])(int);
解读:pi先和[]结合,因此是数组,加int (* )(int)表示其是函数指针
重在理解!!!
例一:
实现计算器(转移表)
法一:(不用函数指针数组)
实现:加,减,乘,除,取余,左移,右移
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- void Menu()
- {
- printf("***************************\n");
- printf("***** 0.quit ********\n");
- printf("***** 1.Add ********\n");
- printf("***** 2.Sub ********\n");
- printf("***** 3.Mul ********\n");
- printf("***** 4.Div ********\n");
- printf("***** 5.Mod ********\n");
- printf("***** 6.Lsh ********\n");
- printf("***** 7.Rsh ********\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 Mod(int x, int y)
- {
- return x % y;
- }
- int Lsh(int x, int y)
- {
- return x << y;
- }
- int Rsh(int x, int y)
- {
- return x >> y;
- }
- int main()
- {
- Menu();
- int x = 0;
- int y = 0;
- int input = 0;
- printf("请输入:\n");
- scanf("%d", &input);
- int ret = 0;
- do
- {
- switch (input)
- {
- case 0:
- {
- printf("退出,欢迎下次使用\n");
- break;
- }
- case 1:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Add(x, y));
- break;
- }
- case 2:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Sub(x, y));
- break;
- }
- case 3:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Mul(x, y));
- break;
- }
- case 4:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Div(x, y));
- break;
- }
- case 5:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Mod(x, y));
- break;
- }
- case 6:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Lsh(x, y));
- break;
- }
- case 7:
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", Rsh(x, y));
- break;
- }
- }
-
-
-
- } while (input);
-
- return 0;
- }
法二:(利用函数指针数组)
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- void Menu()
- {
- printf("***************************\n");
- printf("***** 0.quit ********\n");
- printf("***** 1.Add ********\n");
- printf("***** 2.Sub ********\n");
- printf("***** 3.Mul ********\n");
- printf("***** 4.Div ********\n");
- printf("***** 5.Mod ********\n");
- printf("***** 6.Lsh ********\n");
- printf("***** 7.Rsh ********\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 Mod(int x, int y)
- {
- return x % y;
- }
- int Lsh(int x, int y)
- {
- return x << y;
- }
- int Rsh(int x, int y)
- {
- return x >> y;
- }
- int main()
- {
- Menu();
- int x = 0;
- int y = 0;
- int input = 0;
- int (*pi[8])(int x, int y) = { 0,Add ,Sub,Mul,Div,Mod,Lsh,Rsh};
- printf("请输入:\n");
- scanf("%d", &input);
- int ret = 0;
- if (0 == input)
- {
- printf("退出,欢迎下次使用\n");
- }
- if (1 <= input && input <= 8)
- {
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", (*pi[input])(x, y));
- }
-
- return 0;
- }
结果:

对例题一:
我们通过回调函数来实现它
代码:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- void Menu()
- {
- printf("***************************\n");
- printf("***** 0.quit ********\n");
- printf("***** 1.Add ********\n");
- printf("***** 2.Sub ********\n");
- printf("***** 3.Mul ********\n");
- printf("***** 4.Div ********\n");
- printf("***** 5.Mod ********\n");
- printf("***** 6.Lsh ********\n");
- printf("***** 7.Rsh ********\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 Mod(int x, int y)
- {
- return x % y;
- }
- int Lsh(int x, int y)
- {
- return x << y;
- }
- int Rsh(int x, int y)
- {
- return x >> y;
- }
- void cala(int(*pi)(int , int ))
- {
- int x = 0;
- int y = 0;
- printf("请输入:\n");
- scanf("%d %d", &x, &y);
- printf("%d\n", pi(x, y) );
- }
- int main()
- {
- Menu();
- int x = 0;
- int y = 0;
- int input = 0;
- printf("请输入:\n");
- scanf("%d", &input);
-
- do
- {
- switch (input)
- {
- case 0:
- {
- printf("退出,欢迎下次使用\n");
- break;
- }
- case 1:
- {
- cala(Add);
- break;
- }
- case 2:
- {
- cala(Sub);
- break;
- }
- case 3:
- {
- cala(Mul);
- break;
- }
- case 4:
- {
- cala(Div);
- break;
- }
- case 5:
- {
- cala(Mod);
- break;
- }
- case 6:
- {
- cala(Lsh);
- break;
- }
- case 7:
- {
- cala(Rsh);
- break;
- }
- }
-
-
-
- } while (input);
-
- return 0;
- }

1.头文件为#include
2.里面有四个形参,表里介绍的很详细了
3.作用:其可以排序各种数据类型。
我们先来实现其排序整型:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- #include
- int compare(const void* a, const void* b)
- {
- return (*(int*)a - *(int*)b);
- }
- int main()
- {
- int arr[] = { 1,3,5,7,9,0,8,6,4,2 };
- qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]),compare);
- for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
- {
- printf("%d ", *(arr + i));
- }
- return 0;
- }
结果:

排序结构体:
代码:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- #include
- struct stduent
- {
- char name[20];
- int age;
- double score;
-
- };
- int compare1(const void* a, const void* b)
- {
- return strcmp(((struct stduent*)a)->name, ((struct stduent*)b)->name);
- }
- int compare2(const void* a, const void* b)
- {
- return (*(int*)a-*(int*)b);
- }
- int compare3(const void* a, const void* b)
- {
- return (*(int*)a - *(int*)b);
- }
- void test1()
- {
- struct stduent arr1[] = {{"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0}};
- qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比名字
- for (int i = 0; i < 3; i++)
- {
- printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
- }
- printf("结束\n");
- }
- void test2()
- {
- struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };
- qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare2);//比年龄
- for (int i = 0; i < 3; i++)
- {
- printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
- }
- printf("结束\n");
- }
- void test3()
- {
- struct stduent arr1[] = { {"zhangsan",18,90.5},{"lisi",17,91.7},{"wangwu",20,100.0} };
- qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare1);//比成绩
- for (int i = 0; i < 3; i++)
- {
- printf("%-10s %-5d %8f\n", arr1[i].name, arr1[i].age, arr1[i].score);
- }
- printf("结束\n");
-
- }
- int main()
- {
- test1();
- test2();
- test3();
- return 0;
- }
结果:

实现sqort函数:
- #define _CRT_SECURE_NO_WARNINGS 1
-
- #include
-
- int compare(const void* a, const void* b)
-
- {
-
- return (*((int*)a) - *((int*)b));
-
- }
-
- void swap(const void* x, const void* y, int size)
-
- {
-
- for (int i = 0; i < size; i++)
-
- {
-
- char temp = *((char*)x+i);
-
- *((char*)x + i) = *((char*)y + i);
-
- *((char*)y + i) = temp;
-
- }
-
- }
-
- void Bubble(void* arr, int count, int b, int compare(void*, void*))
-
- {
-
- for (int i = 0; i < count - 1; i++)
-
- {
-
- for (int j = 0; j < count - 1 - i; j++)
-
- {
-
- if (compare((char*)arr + j * b, (char*)arr + (j + 1) * b) > 0)
-
- {
-
- swap((char*)arr + j * b, (char*)arr + (j + 1) * b, b);
-
- }
-
- }
-
- }
-
- }
-
- int main()
-
- {
-
- int arr[10] = { 0 };
-
- int sz = sizeof(arr) / sizeof(arr[0]);
-
- for (int i = 0; i < sz; i++)
-
- {
-
-
-
- scanf("%d",arr+i);
-
- }
-
- Bubble(arr, sz, sizeof(arr[0]), compare);
-
- //输出
-
- for (int i = 0; i < sz; i++)
-
- {
-
- printf("%d ", *(arr + i));
-
- }
-
- return 0;
-
- }
最后,祝福各位学习天天进步!!!