C语言实现回调函数

C语言实现回调函数

一、回调函数概念

回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。

回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。

1.1 什么叫函数指针

函数指针:指向函数的指针

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

函数指针的定义形式为:

复制代码
returnType (*pointerName)(param list);

returnType 为函数返回值类型,pointerName 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

复制代码
比如:int (*pont)(int a, int b);  //point指针变量指向一个返回值为int,有两个参数的函数。 point可以存放函数地址

注意( )的优先级高于*,第一个括号不能省略(如果省略,则变成指针函数),如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *。

【实例】用指针来实现对函数的调用。

c 复制代码
#include <stdio.h>
int add(int a, int b);
int main(void)
{
    int a, b, num;
    //定义函数指针
    int (*point)(int a, int b);
    //指针赋值
    point = add;
    //两种写法都可以
    //point = &add;
    printf("请输入两个正整数,用于相加:");
    scanf("%d%d",&a, &b);
    //调用
    num = point(a, b);
    printf("num:%d\n", num);
    return 0;
}
int add(int a, int b)
{
    int num;
    num = a+b;
    return num;
}

输出结果

c 复制代码
请输入两个正整数,用于相加:33 88
num:121

二、回调函数案例

来直接看代码

c 复制代码
#include <stdio.h>
//函数声明  包含函数指针  
void fun_point(int *num, void (*point)(int a), int n);
//函数声明
void add(int a);
int main(void)
{
    int a = 10, b = 20, num;
    //第二个参数传函数指针(函数名就是地址)
    fun_point(&num, add, a);
    
    printf("num:%d\n", num);
    return 0;
}
//回调函数
void add(int a)
{
    printf("a:%d\n", a);
    printf("helloworld\n");
}
//底层
void fun_point(int *num, void (*point)(int a), int n)
{
    *num = 100;
    //在这里如果是有硬件的支持,可以实现调用的条件,如果底层定时多久才调用:  point(n);  底层有中断触发才调用:  point(n);等条件视情况而写的
    point(n);
}

输出

c 复制代码
a:10
helloworld
num:100

分析

关于何时执行回调函数 void add(int a),关键是底层设计何时调用:point(n),不同的硬件或者功能设计不同,调用point(n)可以是底层满足定时器、中断、信号等条件执行。如FreeRTOS中底层Systick计数到时,实现软件定时器的回调函数的执行,linux下捕获到信号,执行回调函数等。

这个是常见的函数指针使用,在函数的参数为函数指针,通过函数里的参数,启动别一个函数,常用的方法是函数指针。你学会了吗

相关推荐
Wang's Blog2 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
inrichtt2 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
砚底藏山河3 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年3 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym3 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen3 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室3 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
quantdash_cc4 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun4 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
无忧.芙桃4 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态