C语言入门 – 函数指针数组

LongGuan_admin 发布于 5 天前 13 次阅读


什么是函数指针数组

  • 函数指针数组是指存储函数指针的数组
    • 其中每一个数组元素都是一个指向特定签名函数的指针
  • 声明一个函数指针数组
    • 返回类型 (*数组名[数组大小])(参数列表);
    • 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];

函数指针数组的作用

  • 高效分发
    • 仅有O(1) 时间复杂度调用
  • 代码简洁
    • 消除了大量If-else或者switch语句
  • 易于扩展 所有函数都有相同的签名
    • 新增功能只需要添加函数和数组项
  • 动态性
    • 运行时可以改变函数指针指向

常见错误

  • 对于下面的声明 这是一个函数指针
    • int (*funcPtrT)(int, char);
  • 对于下面的声明,这是一个函数指针数组
    • int (*e[7])(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;
}
此作者没有提供个人介绍。
最后更新于 2026-01-10