[通用 MCU] 函数指针详解

[复制链接]
 楼主| xinxianshi 发表于 2025-7-24 19:24 | 显示全部楼层 |阅读模式
函数指针是C/C++中强大的特性,它允许将函数作为参数传递、存储在数据结构中,以及实现回调机制。下面我将全面介绍函数指针的定义和使用方式。

函数指针的基本概念
函数指针是指向函数内存地址的变量,通过它可以间接调用函数。函数指针的类型由函数的返回类型和参数类型共同决定。

函数指针的定义方式
1. 直接定义法
  1. // 定义指向无参数无返回值函数的指针
  2. void (*func_ptr1)();

  3. // 定义指向int(int, int)函数的指针
  4. int (*func_ptr2)(int, int);
2. 使用typedef简化
  1. // 为函数指针类型定义别名
  2. typedef void (*VoidFunc)();
  3. typedef int (*ArithmeticFunc)(int, int);

  4. // 使用别名声明变量
  5. VoidFunc func1;
  6. ArithmeticFunc func2;
3. 函数指针数组
  1. // 定义函数指针数组
  2. int (*operations[3])(int, int);

  3. // 初始化
  4. operations[0] = add;
  5. operations[1] = sub;
  6. operations[2] = mul;
4. 指向函数指针的指针
  1. // 定义函数指针
  2. int (*func)(int, int) = add;

  3. // 定义指向函数指针的指针
  4. int (**func_ptr_ptr)(int, int) = &func;
5. 函数指针作为参数
  1. // 回调函数类型定义
  2. typedef int (*Callback)(int, int);

  3. // 接受函数指针作为参数的函数
  4. int calculate(int a, int b, Callback op) {
  5.     return op(a, b);
  6. }

  7. // 使用
  8. int result = calculate(10, 5, add);
6. 函数指针作为返回值
  1. // 根据操作符返回对应的函数指针
  2. ArithmeticFunc get_operation(char op) {
  3.     switch(op) {
  4.         case '+': return add;
  5.         case '-': return sub;
  6.         case '*': return mul;
  7.         default: return NULL;
  8.     }
  9. }

  10. // 使用
  11. ArithmeticFunc op_func = get_operation('+');
  12. if(op_func) {
  13.     int result = op_func(10, 5);
  14. }


 楼主| xinxianshi 发表于 2025-7-24 19:25 | 显示全部楼层
完整示例代码
  1. #include <stdio.h>

  2. // 函数声明
  3. int add(int a, int b);
  4. int sub(int a, int b);
  5. int mul(int a, int b);

  6. // 函数指针类型定义
  7. typedef int (*ArithmeticFunc)(int, int);

  8. // 函数实现
  9. int add(int a, int b) { return a + b; }
  10. int sub(int a, int b) { return a - b; }
  11. int mul(int a, int b) { return a * b; }

  12. // 接受函数指针作为参数的函数
  13. int calculate(int a, int b, ArithmeticFunc op) {
  14.     if(!op) {
  15.         printf("无效操作!\n");
  16.         return 0;
  17.     }
  18.     return op(a, b);
  19. }

  20. // 根据操作符返回函数指针
  21. ArithmeticFunc get_operation(char op) {
  22.     switch(op) {
  23.         case '+': return add;
  24.         case '-': return sub;
  25.         case '*': return mul;
  26.         default: return NULL;
  27.     }
  28. }

  29. int main() {
  30.     int a = 20, b = 5;
  31.    
  32.     // 1. 直接使用函数指针
  33.     ArithmeticFunc func_ptr = add;
  34.     printf("直接调用: %d + %d = %d\n", a, b, func_ptr(a, b));
  35.    
  36.     // 2. 使用函数指针数组
  37.     ArithmeticFunc operations[] = {add, sub, mul};
  38.     char* names[] = {"加法", "减法", "乘法"};
  39.    
  40.     printf("\n函数指针数组:\n");
  41.     for(int i = 0; i < 3; i++) {
  42.         printf("%s: %d\n", names[i], operations[i](a, b));
  43.     }
  44.    
  45.     // 3. 函数指针作为参数
  46.     printf("\n函数指针作为参数:\n");
  47.     printf("加法结果: %d\n", calculate(a, b, add));
  48.     printf("减法结果: %d\n", calculate(a, b, sub));
  49.    
  50.     // 4. 函数指针作为返回值
  51.     printf("\n函数指针作为返回值:\n");
  52.     ArithmeticFunc op = get_operation('*');
  53.     if(op) {
  54.         printf("乘法结果: %d\n", op(a, b));
  55.     }
  56.    
  57.     // 5. 指向函数指针的指针
  58.     printf("\n指向函数指针的指针:\n");
  59.     ArithmeticFunc *func_ptr_ptr = &func_ptr;
  60.     printf("通过双重指针调用: %d + %d = %d\n", a, b, (*func_ptr_ptr)(a, b));
  61.    
  62.     return 0;
  63. }
 楼主| xinxianshi 发表于 2025-7-24 19:25 | 显示全部楼层
函数指针的应用场景
回调函数:在事件驱动编程中处理异步操作

策略模式:运行时选择不同的算法

插件系统:动态加载和调用函数

状态机:根据状态调用不同的处理函数

命令模式:将操作封装为可调用的对象
 楼主| xinxianshi 发表于 2025-7-24 19:25 | 显示全部楼层
注意事项
类型安全:确保函数指针类型与实际函数签名匹配

空指针检查:调用前检查函数指针是否为NULL

可读性:使用typedef提高代码可读性

平台兼容性:不同平台可能有不同的调用约定

C++注意事项:在C++中,成员函数指针有不同的语法

函数指针是C/C++中实现多态和灵活设计的重要工具,掌握它们可以大大提高代码的灵活性和可扩展性。
tpgf 发表于 2025-7-26 16:49 | 显示全部楼层
将函数作为参数传递给其他函数,在特定事件触发时调用。这是异步编程和事件驱动的基础
szt1993 发表于 2025-7-30 13:09 | 显示全部楼层
函数指针详解
LOVEEVER 发表于 2025-7-31 09:52 | 显示全部楼层
函数指针是指向函数内存地址的变量,通过它可以间接调用函数。函数指针的类型由函数的返回类型和参数类型共同决定。
 楼主| xinxianshi 发表于 2025-8-16 07:46 | 显示全部楼层
类似一个变量。
AdaMaYun 发表于 2025-8-18 23:14 | 显示全部楼层
函数指针是C/C++中强大的特性,它允许将函数作为参数传递、存储在数据结构中,以及实现回调机制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部