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;
}
posted @ 2024-05-23 16:53  岸南  阅读(22)  评论(0编辑  收藏  举报