C——函数指针数组
简介
函数指针数组是一个复杂但非常有用的概念,它结合了指针、数组和函数指针的特性。为了更好地理解函数指针数组,我们需要从基本概念开始,逐步深入。
指针
指针是一个变量,它存储了另一个变量的内存地址。
int a = 10;
int *p = &a; // p 是一个指向 int 类型的指针,存储 a 的地址
指针数组
针数组是一个数组,其中每个元素都是指针。
int a = 10, b = 20, c = 30;
int *arr[3]; // 定义一个指针数组,包含 3 个元素,每个元素都是指向 int 的指针
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
// 访问数组元素
printf("%d\n", *arr[0]); // 输出 10
printf("%d\n", *arr[1]); // 输出 20
printf("%d\n", *arr[2]); // 输出 30
函数指针
函数指针是指向函数的指针,可以通过它来调用函数。函数指针的声明方式类似于函数的声明,只不过在函数名的位置使用指针符号 *。
int add(int a, int b) {
return a + b;
}
int (*func_ptr)(int, int); // 定义一个指向返回值为 int,参数为两个 int 的函数指针
func_ptr = add; // 将 add 函数的地址赋值给函数指针
int result = func_ptr(2, 3); // 通过函数指针调用 add 函数
printf("%d\n", result); // 输出 5
函数指针数组
函数指针数组是一个数组,其中每个元素都是指向函数的指针。它结合了指针数组和函数指针的概念,可以用来存储多个函数的地址。
#include <stdio.h>
// 定义几种操作函数,每个函数接收两个整数并返回一个整数
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
if (b != 0) {
return a / b;
} else {
printf("Error: Division by zero!\n");
return 0;
}
}
// 定义一个枚举类型,表示操作类型
typedef enum {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE,
OPERATION_COUNT // 操作类型的数量
} OperationType;
// 定义函数指针类型,指向接收两个整数并返回整数的函数
typedef int (*OperationFunc)(int, int);
// 定义一个函数指针数组,根据操作类型索引来选择相应的函数
OperationFunc operations[OPERATION_COUNT] = {
add,
subtract,
multiply,
divide
};
// 根据操作类型调用相应的函数
int performOperation(OperationType type, int a, int b) {
if (type < 0 || type >= OPERATION_COUNT) {
printf("Error: Invalid operation type!\n");
return 0;
}
return operations[type](a, b);
}
// 测试函数指针数组的使用
int main() {
int a = 10, b = 5;
printf("Add: %d + %d = %d\n", a, b, performOperation(ADD, a, b));
printf("Subtract: %d - %d = %d\n", a, b, performOperation(SUBTRACT, a, b));
printf("Multiply: %d * %d = %d\n", a, b, performOperation(MULTIPLY, a, b));
printf("Divide: %d / %d = %d\n", a, b, performOperation(DIVIDE, a, b));
return 0;
}