C语言---函数指针和回调函数

文章目录

  • [一、 函数指针 (Function Pointers)](#一、 函数指针 (Function Pointers))
    • [1. 什么是函数指针?](#1. 什么是函数指针?)
    • [2. 定义语法](#2. 定义语法)
  • [二、 回调函数 (Callback Functions)](#二、 回调函数 (Callback Functions))
    • [1. 什么是回调函数?](#1. 什么是回调函数?)
    • [2. 为什么需要回调函数?](#2. 为什么需要回调函数?)

在C语言中,函数指针和回调函数是高级编程中不可或缺的工具。它们允许程序在运行时动态地决定调用哪个函数,从而极大地提高了代码的灵活性和可重用性。

一、 函数指针 (Function Pointers)

1. 什么是函数指针?

在C语言中,函数名本身就代表了该函数在内存中的起始地址。函数指针就是一个变量,它存储了这个地址。

2. 定义语法

定义函数指针的格式如下:

bash 复制代码
返回值类型 (*指针变量名)(参数类型列表);

注意:(*指针变量名) 必须加括号,否则会变成一个返回指针的函数声明。

示例代码

bash 复制代码
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    // 1. 定义一个函数指针 p,指向返回值为int,有两个int参数的函数
    int (*p)(int, int);

    // 2. 将 add 函数的地址赋给 p
    p = add; 

    // 3. 通过指针调用函数(两种写法均可)
    int result1 = p(10, 20);      // 常用写法
    int result2 = (*p)(10, 20);   // 显式解引用写法

    printf("Result: %d\n", result1);
    return 0;
}

二、 回调函数 (Callback Functions)

1. 什么是回调函数?

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

简而言之:如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

2. 为什么需要回调函数?

解耦:调用者不需要知道具体的实现逻辑。

灵活性:可以在运行时动态地改变行为。

示例代码:一个简单的计算器框架

通过回调函数,我们可以编写一个通用的"运算中心",而具体的加减乘除逻辑在外部定义。

bash 复制代码
#include <stdio.h>

// 回调函数定义:加法
int add(int a, int b) { return a + b; }
// 回调函数定义:乘法
int multiply(int a, int b) { return a * b; }

// 执行器函数:接受一个函数指针作为参数(回调)
void calculate(int x, int y, int (*operation)(int, int)) {
    int res = operation(x, y); // 调用传入的回调函数
    printf("Result: %d\n", res);
}

int main() {
    printf("Adding: ");
    calculate(5, 3, add);       // 传入 add 函数

    printf("Multiplying: ");
    calculate(5, 3, multiply);  // 传入 multiply 函数

    return 0;
}
相关推荐
天“码”行空20 小时前
简化Lambda——方法引用
java·开发语言
z203483152021 小时前
C++对象布局
开发语言·c++
Beginner x_u21 小时前
如何解释JavaScript 中 this 的值?
开发语言·前端·javascript·this 指针
java1234_小锋21 小时前
Java线程之间是如何通信的?
java·开发语言
张张努力变强21 小时前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
feifeigo1231 天前
基于EM算法的混合Copula MATLAB实现
开发语言·算法·matlab
鑫—萍1 天前
嵌入式开发学习——STM32单片机入门教程
c语言·驱动开发·stm32·单片机·嵌入式硬件·学习·硬件工程
LYS_06181 天前
RM赛事C型板九轴IMU解算(4)(卡尔曼滤波)
c语言·开发语言·前端·卡尔曼滤波
盛世宏博北京1 天前
高效环境管控:楼宇机房以太网温湿度精准监测系统方案
开发语言·数据库·php·以太网温湿度变送器
IT猿手1 天前
六种智能优化算法(NOA、MA、PSO、GA、ZOA、SWO)求解23个基准测试函数(含参考文献及MATLAB代码)
开发语言·算法·matlab·无人机·无人机路径规划·最新多目标优化算法