潮流设计网站,帮别人做设计图的网站,网络产品及其推广方法,网站 备案 查询函数指针数组
函数指针数组的作用
函数指针数组是一个数组#xff0c;其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量#xff0c;可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。
函数指针数组的使用场景有很多其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。
函数指针数组的使用场景有很多以下是一些常见的应用
回调函数函数指针数组可以用于实现回调机制即在某个事件发生时根据不同的情况选择并调用相应的回调函数。状态机函数指针数组可以用于实现状态机即根据当前状态选择并调用相应的处理函数。命令分发函数指针数组可以用于实现命令分发即根据接收到的命令选择并调用相应的处理函数。策略模式函数指针数组可以用于实现策略模式即根据不同的策略选择并调用相应的处理函数。
总之函数指针数组提供了一种灵活的方式来选择并调用不同的函数可以根据具体需求动态地改变函数的行为。
——————————————————————————————————————————
函数指针数组的语法格式
函数指针数组是一个数组其中的元素都是函数指针。函数指针是指向函数的指针变量可以用来调用相应的函数。函数指针数组的语法格式如下
返回值类型 (*指针数组名[数组大小])(参数列表);
其中返回值类型是函数的返回值类型指针数组名是函数指针数组的名称数组大小是指针数组中元素的个数参数列表是函数的参数类型和个数。
举个例子
如果我们有一个函数指针数组其中包含两个元素个元素都指向一个无返回值、无参数的函数可以这样声明
void (*funcPtrArray[2])();这里funcPtrArray是一个包含两个元素的函数指针数组每个元素都是一个指向无返回值、无参数的函数的指针。
使用函数指针数组时可以通过索引来访问数组中的元素并通过函数指针调用相应的函数。
——————————————————————————————————————————
函数指针数组语法格式的讲解
举例来说我们可以定义一个函数指针数组其中的元素指向不同的排序算法函数
#include stdio.h// 声明排序算法函数
void bubbleSort(int arr[], int size);
void selectionSort(int arr[], int size);
void insertionSort(int arr[], int size);int main() {// 定义函数指针数组并初始化void (*sortFuncs[3])(int[], int) {bubbleSort, selectionSort, insertionSort};//函数指针 函数指针定义三个 然后是数组和整形类型的// 调用函数指针数组中的函数int arr[] {5, 2, 8, 1, 9};int size sizeof(arr) / sizeof(arr[0]);for (int i 0; i 3; i) {sortFuncs[i](arr, size);//这里主要是看这一段 这个代码是我随机从网上找的主要是让你们看看这个语法格式的使用 下面会进行转移表也就是计算器的使用版本2就是采取函数指针数组的形势进行计算的printf(排序结果);for (int j 0; j size; j) {printf(%d , arr[j]);}printf(\n);}return 0;
}// 冒泡排序
void bubbleSort(int arr[], int size) {// 排序逻辑...
}// 选择排序
void selectionSort(int arr[], int size) {// 排序逻辑...
}// 插入排序
void insertionSort(int arr[], int size) {// 排序逻辑...
} ——————————————————————————————————————————————————————————————————————————————————————
函数指针数组的实际使用转移表计算器
这里会简单提一嘴在指针4篇章还会进行详细的解释指针4篇章会详细解释qsort函数的使用和构建模拟
计算器的模拟版本1
运算函数 主函数 计算器形成 但是之前的代码是有问题的冗余性太强
#includestdio.h// 函数原型声明
int add(int x, int y);
int subtract(int x, int y);
int multiply(int x, int y);
int divide(int x, int y);int main() {int input;printf(请输入运算类型1-加法2-减法3-乘法4-除法0-退出);scanf(%d, input);while (input ! 0) {switch (input) {case 1:printf(请输入两个加数);int x, y;scanf(%d %d, x, y);printf(%d\n, add(x, y));break;case 2:printf(请输入两个减数);scanf(%d %d, x, y);printf(%d\n, subtract(x, y));break;case 3:printf(请输入两个乘数);scanf(%d %d, x, y);printf(%d\n, multiply(x, y));break;case 4:printf(请输入两个数其中第二个数为除数);scanf(%d %d, x, y);if (y ! 0) {printf(%d\n, divide(x, y));} else {printf(除数不能为0。\n);}break;default:printf(输入错误请输入正确的运算类型。\n);break;}printf(是否继续0-否其他值-是);scanf(%d, input);}printf(退出计算器。\n);return 0;
}// 函数定义
int add(int x, int y) {return x y;
}int subtract(int x, int y) {return x - y;
}int multiply(int x, int y) {return x * y;
}int divide(int x, int y) {return x / y;
}这里ai解释一下 不过多赘述
这次计算机的目的是为了进行回调函数和函数指针数组的学习这段C语言代码实现了一个简单的计算器能够进行加法、减法、乘法和除法运算。下面是逐行解释
1. #includestdio.h这行代码包含了标准输入输出头文件stdio.h它是C语言中用于输入输出函数的基础头文件。
2. 函数原型声明这些是函数原型声明指明了将要定义的四个函数add、subtract、multiply和divide的返回类型和参数类型。
3. int main()这是主函数的定义main是C程序的入口点。
4. int input;这行代码定义了一个整数变量input用于存储用户的选择。
5. printf(请输入运算类型1-加法2-减法3-乘法4-除法0-退出);这行代码打印出提示信息要求用户输入运算类型。
6. scanf(%d, input);这行代码使用scanf函数从用户那里读取一个整数并存储在变量input中。
7. while (input ! 0) {这是一个while循环它会在用户输入0之前一直执行。
8. switch (input)这是一个switch语句它根据变量input的值来执行不同的代码块。
9. case 1:这是一个case标签当input等于1时执行后面的代码块。
10. printf(请输入两个加数);这行代码打印出提示信息要求用户输入两个加数。
11. scanf(%d %d, x, y);这行代码使用scanf函数从用户那里读取两个整数并存储在变量x和y中。
12. printf(%d\n, add(x, y));这行代码调用add函数并打印出返回的结果。
13. break;这个关键字用于退出switch语句。
14. case 2:这是一个case标签当input等于2时执行后面的代码块。
15. printf(请输入两个减数);这行代码打印出提示信息要求用户输入两个减数。
16. scanf(%d %d, x, y);这行代码使用scanf函数从用户那里读取两个整数并存储在变量x和y中。
17. printf(%d\n, subtract(x, y));这行代码调用subtract函数并打印出返回的结果。
18. break;这个关键字用于退出switch语句。
19. case 3:这是一个case标签当input等于3时执行后面的代码块。
20. printf(请输入两个乘数);这行代码打印出提示信息要求用户输入两个乘数。
21. scanf(%d %d, x, y);这行代码使用scanf函数从用户那里读取两个整数并存储在变量x和y中。
22. printf(%d\n, multiply(x, y));这行代码调用multiply函数并打印出返回的结果。
23. break;这个关键字用于退出switch语句。
24. case 4:这是一个case标签当input等于4时执行后面的代码块。
25. printf(请输入两个数其中第二个数为除数);这行代码打印出提示信息要求用户输入两个数其中第二个数为除数。
26. scanf(%d %d, x, y);这行代码使用scanf函数从用户那里读取两个整数并存储在变量x和y中。
27. if (y ! 0) {这是一个if语句它检查除数y是否不为0。
28. printf(%d\n, divide(x, y));这行代码调用
———————————————————————————————————————————
计算器的模拟版本2函数指针数组的使用回调函数
简化 冗余 老的代码的问题就是
冗余
写死
不能完成不同的任务 函数调用的时候只需要知道地址就可以
calc计算器 这里也称之为转移表
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int add(int x, int y)
{return x y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf(**************************\n);printf(***** 0 退出 ******\n);printf(***** 1 加法 ******\n);printf(***** 2 减法 ******\n);printf(***** 3 乘法 ******\n);printf(***** 4 除法 ******\n);printf(**************************\n);
}
void cala(int* compute(int, int))
{int x 0; int y 0;int pf 0;scanf(%d %d, x, y);pf compute(x, y);printf(%d , pf);
}
int main()
{meun();int input 0;scanf(%d, input); switch (input){case 0:break;case 1:cala(add);break;case 2:cala(subtract);break;case 3:cala(subtract);break;case 4:cala(except);break;default:break;}
}这里 用ai 逐行解释一下 我不过多作图解释了
1. #define _CRT_SECURE_NO_WARNINGS 1这是一个预处理器指令用于告诉编译器忽略与安全相关的警告
2. #includestdio.h这是一个预处理器指令用于包含标准输入输出头文件stdio.h这是C语言中用于输入输出函数的基础头文件。
3. int add(int x, int y)这是一个函数定义add是一个函数名它接受两个整数参数x和y并返回它们的和。
4. int subtract(int x, int y)这是另一个函数定义subtract是一个函数名它接受两个整数参数x和y并返回它们的差。
5. int multiply(int x, int y)这是另一个函数定义multiply是一个函数名它接受两个整数参数x和y并返回它们的积。
6. int except(int x, int y)这是另一个函数定义except是一个函数名它接受两个整数参数x和y并返回它们的商。注意这个函数没有进行除数是否为0的检查这在实际使用中是不安全的。
7. void meun()这是一个函数定义meun是一个函数名它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. void cala(int* compute(int, int))这是另一个函数定义cala是一个函数名它接受一个指向函数的指针作为参数。这个函数的作用是调用用户提供的运算函数并打印出结果。
9. int main()这是主函数的定义main是一个特殊的关键字表示程序的入口点。
10. meun();这行代码调用meun函数打印出菜单。
11. int input 0;这行代码定义了一个整数变量input并初始化为0用于存储用户的选择。
12. scanf(%d, input);这行代码使用scanf函数从用户那里读取一个整数并存储在变量input中。
13. switch (input)这是一个switch语句它根据变量input的值来执行不同的代码块。
14. case 0:这是一个case标签当input等于0时执行后面的代码块。
15. break;这个关键字用于退出switch语句。
16. case 1:这是一个case标签当input等于1时执行后面的代码块。
17. cala(add);这行代码调用cala函数并传递add函数的地址作为参数。
18. break;这个关键字用于退出switch语句。
19. case 2:这是一个case标签当input等于2时执行后面的代码块。
20. cala(subtract);这行代码调用cala函数并传递subtract函数的地址作为参数。
21. break;这个关键字用于退出switch语句。
22. case 3:这是一个case标签当input等于3时执行后面的代码块。
23. cala(subtract);这行代码调用cala函数并传递subtract函数的地址作为参数。这里似乎是一个错误因为subtract函数并不适合乘法操作。
24. break;这个关键字用于退出switch语句。
25. case 4:这是一个case标签当input等于4时执行后面的代码块。
26. cala(except);这行代码调用cala函数并传递except函数的地址作为参数。
27. break;
——————————————————————————————————————————
版本3函数指针数组的使用
计算机代码的简化
创建函数指针的数组 #define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
int add(int x, int y)
{return x y;
}
int subtract(int x, int y)
{return x - y;
}
int multiply(int x, int y)
{return x * y;
}
int except(int x, int y)
{return x / y;
}
void meun()
{printf(**************************\n);printf(***** 0 退出 ******\n);printf(***** 1 加法 ******\n);printf(***** 2 减法 ******\n);printf(***** 3 乘法 ******\n);printf(***** 4 除法 ******\n);printf(**************************\n);
}
int main()
{int (*compute[5])(int, int) { 0, add,subtract,multiply,except };int input 0; do{meun();printf(请选择\n);scanf(%d, input);printf(请输入);if (input1 input4){int x 0; int y 0; int zd 0;scanf(%d %d, x, y);zd (*compute[input])(x, y);printf(%d\n, zd);}else if (input 0){printf(退出程序。);break;}else {printf(输入错误。);}} while (input);
}这里 用ai 逐行解释一下 我不过多作图解释了
这段代码是C语言编写的一个简单计算器程序下面是逐行解释
1. #define _CRT_SECURE_NO_WARNINGS 1这是一个预处理器指令用于告诉编译器忽略与安全相关的警告特别是在使用像fgets、fopen等函数时。这行代码应该只包含一次重复定义可能会导致编译错误。
2. #includestdio.h这是一个预处理器指令用于包含标准输入输出头文件stdio.h这是C语言中用于输入输出函数的基础头文件。
3. int add(int x, int y)这是一个函数定义add是一个函数名它接受两个整数参数x和y并返回它们的和。
4. int subtract(int x, int y)这是另一个函数定义subtract是一个函数名它接受两个整数参数x和y并返回它们的差。
5. int multiply(int x, int y)这是另一个函数定义multiply是一个函数名它接受两个整数参数x和y并返回它们的积。
6. int except(int x, int y)这是另一个函数定义except是一个函数名它接受两个整数参数x和y并返回它们的商。注意这个函数没有进行除数是否为0的检查这在实际使用中是不安全的。
7. void meun()这是一个函数定义meun是一个函数名它没有返回值。这个函数的作用是打印出菜单供用户选择运算类型。
8. int main()这是主函数的定义main是一个特殊的关键字表示程序的入口点。
9. int (*compute[5])(int, int) { 0, add,subtract,multiply,except }这行代码定义了一个函数指针数组compute长度为5。每个元素指向一个算术运算函数。数组的第一个元素被初始化为0这通常用于指针数组的终止标志。
10. int input 0;这行代码定义了一个整数变量input并初始化为0用于存储用户的选择。
11. do这是一个循环开始关键字表示开始一个do-while循环。
12. meun();这行代码调用meun函数打印出菜单。
13. printf(请选择\n);这行代码打印出提示信息“请选择”。
14. scanf(%d, input);这行代码使用scanf函数从用户那里读取一个整数并存储在变量input中。
15. printf(请输入);这行代码打印出提示信息“请输入”。
16. if (input1 input4)这是一个条件判断检查用户输入是否在1到4之间包括1和4。
17. { int x 0; int y 0; int zd 0;这个大括号开始了一个代码块用于执行当用户输入在1到4之间时的操作。
18. scanf(%d %d, x, y);这行代码使用scanf函数从用户那里读取两个整数并存储在变量x和y中。
19. zd (*compute[input])(x, y);这行代码调用相应的运算函数并将结果存储在变量zd中。
20. printf(%d\n, zd);这行代码打印出计算结果。
21. }这个大括号结束了上面的代码块。
22. else if (input 0)这是另一个条件判断检查用户输入是否为0。
23. { printf(退出程序。);这个代码块用于执行当用户输入为0时的操作打印出提示信息。
24. break;这个关键字用于退出循环。
25. }这个大括号结束了上面的条件判断。
26. else这是另一个条件判断用于处理用户输入不在1到4之间
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
计算器代码总结
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
//菜单
void meun()
{printf(**************************\n);printf(***** 0 退出 ******\n);printf(***** 1 加法 ******\n);printf(***** 2 减法 ******\n);printf(***** 3 乘法 ******\n);printf(***** 4 除法 ******\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 dive(int x, int y)
{return x / y;
}//函数指针数组的使用
void Function_pointers()
{int(*compute[5])(int, int) { 0,add,sub,mul,dive };int input 0; int x 0; int y 0;do{if (input 0 input 4){meun();printf(请输入\n);scanf(%d, input);printf(请输入计算数值\n);scanf(%d %d, x, y);int outcome (*compute[input])(x, y);printf(结果是%d\n, outcome);}else if (input 0){printf(退出);break;}else{printf(输入错误。);}} while (input);
}//回调函数的使用依旧是指针函数数组
void invoke(int*ps(int, int))
{int x 0; int y 0;printf(请输入计算数值\n);scanf(%d %d, x, y);int outcome (*ps)(x, y);printf(结果是%d\n, outcome);}
void Callback()
{int input 0;do{meun();printf(请输入\n);scanf(%d, input);switch (input){case 0:break;case 1:invoke(add);break;case 2:invoke(sub);break;case 3:invoke(mul);break;case 4:invoke(dive);break;default:printf(输入错误。);break;}} while (input);
}
//正常计算函数
void count()
{int input 0;do{int x 0; int y 0;meun();printf(请输入\n);scanf(%d, input);int outcomt 0;switch (input){case 0:printf(退出);break;case 1:printf(请输入计算数值\n);scanf(%d %d, x, y);outcomt add(x, y);printf(结果是%d\n, outcomt);break;case 2:printf(请输入计算数值\n);scanf(%d %d, x, y);outcomt sub(x, y);printf(结果是%d\n, outcomt);break;case 3:printf(请输入计算数值\n);scanf(%d %d, x, y);outcomt mul(x, y);printf(结果是%d\n, outcomt);break;case 4:printf(请输入计算数值\n);scanf(%d %d, x, y);outcomt dive(x, y);printf(结果是%d\n, outcomt);break;default:printf(输入错误。);break;}} while (input);
}//主函数
int main()
{//printf(函数指针数组的使用\n);//Function_pointers();//printf(回调函数的使用\n);//Callback();printf(正常函数的使用\n);count();
}