什么是函数指针数组
- 函数指针数组是指存储函数指针的数组
- 声明一个函数指针数组
- 返回类型 (*数组名[数组大小])(参数列表);
int (*e[7])(int, char);
函数指针数组的基本结构
- 对于int (*e[7])(int, char);
- 在这个函数指针数组中
- e[7] :e是一个包含7个元素的数组
- *e[7] : 数组的每个元素都是一个指针
- (*e[7])(int, char) : 这些指针指向的函数 ,第一个参数是int 第二个参数是char
- int (*e[7])(int, char): 这些函数返回int类型
//对于这个函数指针数组,可以等效为
int (*funcPtrT)(int, char);
funcPtrT e[7];
函数指针数组的作用
- 高效分发
- 代码简洁
- 易于扩展 所有函数都有相同的签名
- 动态性
- 与ifelse语句和switch语句相比,函数指针数组可以通过数组的索引直接调用函数,速度更快,代码页更加具有阅读性和维护性
常见错误
- 对于下面的声明 这是一个函数数组,而并非函数指针数组
- 对于下面的声明 这是一个函数指针
- int (*funcPtrT)(int, char);
- 对于下面的声明,这是一个函数指针数组
实例
//对于int (*e[7])(int, char)
// 定义几个符合签名的函数
int func1(int a, char b) { return a + b; }
int func2(int a, char b) { return a * b; }
int func3(int a, char b) { return a - b; }
// 将函数地址赋给数组元素
e[0] = func1;
e[1] = func2;
e[2] = func3;
// 通过数组调用函数
int result1 = e[0](5, 'A'); // 调用func1
int result2 = e[1](3, 'B'); // 调用func2
int result3 = (*e[2])(10, 'C'); // 另一种调用方式
参考代码段
//针对于int (*e[7])(int, char),可以做出以下实例
//这是一个简单的计算器实例
#include <stdio.h>
// 函数指针数组类型声明
int (*e[7])(int, char);
// 符合签名的函数定义
int add(int a, char b) {
printf("执行加法: %d + %d = ", a, b);
return a + b;
}
int subtract(int a, char b) {
printf("执行减法: %d - %d = ", a, b);
return a - b;
}
int multiply(int a, char b) {
printf("执行乘法: %d × %d = ", a, b);
return a * b;
}
int divide(int a, char b) {
if (b == 0) {
printf("错误:除数不能为0\n");
return 0;
}
printf("执行除法: %d ÷ %d = ", a, b);
return a / b;
}
int modulus(int a, char b) {
if (b == 0) {
printf("错误:模运算除数不能为0\n");
return 0;
}
printf("执行取模: %d %% %d = ", a, b);
return a % b;
}
int bitwise_and(int a, char b) {
printf("执行按位与: %d & %d = ", a, b);
return a & b;
}
int bitwise_or(int a, char b) {
printf("执行按位或: %d | %d = ", a, b);
return a | b;
}
// 初始化函数指针数组
void init_function_table() {
e[0] = add;
e[1] = subtract;
e[2] = multiply;
e[3] = divide;
e[4] = modulus;
e[5] = bitwise_and;
e[6] = bitwise_or;
}
// 显示菜单
void show_menu() {
printf("\n=== 计算器函数表 ===\n");
printf("0. 加法\n");
printf("1. 减法\n");
printf("2. 乘法\n");
printf("3. 除法\n");
printf("4. 取模\n");
printf("5. 按位与\n");
printf("6. 按位或\n");
printf("7. 退出\n");
printf("===================\n");
}
int main() {
int choice;
int num1;
char num2;
// 初始化函数指针数组
init_function_table();
while (1) {
show_menu();
printf("请选择操作 (0-7): ");
scanf("%d", &choice);
if (choice == 7) {
printf("退出程序\n");
break;
}
if (choice < 0 || choice > 6) {
printf("无效选择,请重试\n");
continue;
}
printf("请输入两个数(第二个数会自动转为char): ");
scanf("%d %hhd", &num1, &num2);
// 通过函数指针数组调用对应的函数
int result = e[choice](num1, num2);
printf("%d\n", result);
}
return 0;
}
Comments NOTHING