C语言 | 函数指针作为函数的参数

C语言 | 函数指针作为函数的参数函数指针有两种常用的用法 一种是作为结构体成员 关于函数指针作为结构体成员的用法可移步至上一篇 C 语言笔记 函数指针作为结构体成员进行查看 另一种是函数指针作为函数的参数 这一篇分享的是函数指针作为函数的参数 一 函数指针作为函数的参数函数指针可以作为一个参数传递给另一个函数 这时函数指针的使用就像普通的常量和变量一样 当函数指针作为参数传递的时候 这时接收参数传递的函数通常需要根据这个指针调

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

函数指针有两种常用的用法,一种是作为结构体成员,关于函数指针作为结构体成员的用法可移步至上一篇【C语言笔记】函数指针作为结构体成员进行查看。另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数。

一、函数指针作为函数的参数

函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为参数传递的时候,这时接收参数传递的函数通常需要根据这个指针调用这个函数。作为参数传递的函数指针通常表示回调函数(Callback Functions)

1、什么是回调函数?

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

2、回调函数在实际中有什么作用?

先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

例如,在C语言的通用工具库stdlib.h中,有如下一个函数原型:

void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *)) 

这是在C通用工具库中声明的一个快速排序算法函数,其可以用来排序int类型、float类型以及字符串数据,可以按从小到大的顺序也可以按从大到小的顺序排序。其关键在于函数指针comp指向的函数的具体实现。

二、举例说明

上一节我们使用函数指针作为结构体成员来实现四则运算,这里一节我们稍微修改一下代码,使用函数指针作为函数参数来实现四则运算。

设计如下函数:

int calculate(int a, int b, fun_t operation) { 
    int result; result = operation(a, b); // 运算 return result; } 

其中,fun_t是一个函数指针,其定义为:

typedef int (*fun_t)(int, int); 

该函数指针fun_t指向一个带两个int类型的形参、int类型的返回值的函数。使用关键字typedefint (*)(int, int)进行重命名(封装)为fun_t。关于typedef与define的区别可查看往期笔记:【C语言笔记】#define与typedef的区别?

根据函数指针变量operation指向不同的运算函数可实现加法运算、减法运算、乘法运算、除法运算。

主函数代码如下:

int main(void) { 
    int result; int a = 192, b = 48; /* 两个数相加的操作 */ result = calculate(a, b, add2); printf("加法运算: %d+%d = %d\n",a, b, result); /* 两个数相减的操作 */ result = calculate(a, b, sub2); printf("减法运算: %d-%d = %d\n",a, b, result); /* 两个数相乘的操作 */ result = calculate(a, b, mul2); printf("乘法运算: %d*%d = %d\n",a, b, result); /* 两个数相除的操作 */ result = calculate(a, b, div2); printf("除法运算: %d/%d = %d\n",a, b, result); return 0; } 

实现运算的4个函数很简单,如下:

int add2(int a, int b) { 
    return a+b; } int sub2(int a, int b) { 
    return a-b; } int mul2(int a, int b) { 
    return a*b; } int div2(int a, int b) { 
    return a/b; } 

程序运行结果为:

VHQH6x.md.png

以上就是关于函数指针作为函数参数的笔记,如有错误欢迎指出!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212964.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:51
下一篇 2026年3月18日 下午6:52


相关推荐

  • php stderr,php标准输入与输出(STDIN、STDOUT、STDERR)

    php stderr,php标准输入与输出(STDIN、STDOUT、STDERR)例子 phpinput 脚本 cmd 终端复制代码代码示例 askforinputf stdout enteryournam getinput name trim fgets stdin 接收用户输入 writeinputba stdout hello name gt 运行方法 1 运行 cmd2 跳至 ph

    2025年12月6日
    5
  • Leonardo.Ai教程:Midjourney的免费替代品怎么用?

    Leonardo.Ai教程:Midjourney的免费替代品怎么用?

    2026年3月15日
    3
  • 冷钱包 开发 c语言,冷钱包是什么?教你创建冷钱包

    冷钱包 开发 c语言,冷钱包是什么?教你创建冷钱包原标题 冷钱包是什么 教你创建冷钱包玩币的人都有自己的比特币钱包 而钱包按照私钥的存储方式又分为冷钱包和热钱包两种 热钱包就不用说了 即是我们平时用来交易的在线钱包 它的特点是使用方便 易操作 而冷钱包是指网络不能访问到你私钥的钱包 即离线钱包 它的优点是 very 安全 不用担心私钥被盗 但是操作麻烦 而且也存在物理安全风险 比如电脑丢失损坏等 所以通常情况下我们使用的都是热钱包 但是当持有比特

    2026年3月26日
    1
  • 数据库建立

    数据库建立1, 在我们写完计划表后开始建立数据库,数据库的建立不是说建立完了就可以了,到后面是需要不断地改善的,因为前期的数据我们可能列举出表时不够完整,或者表与表之间的关系链接错误,重复。2, 随着项目的功能实现,渐渐的数据库的数据显示出不足,我们就要进行改善1, 数据库的建立要先对项目的功能有足够的理解,要熟悉项目,把项目的表列举出来,那些数据是属于那个表的,一个表里面需要获取到那些表的信息,确定…

    2022年7月24日
    9
  • 【转载】热电偶和热电阻的区别

    一、热电阻和热电偶的测量原理1、热电偶的测量原理热电偶工作原理是基于赛贝克(seeback)效应,即两种不同成分的导体两端连接成回路,如两连接端温度不同,则在回路内产生热电流的物理现象。热电偶由两根不同导线(热电极)组成,它们的一端是互相焊接的,形成热电偶的测量端(也称工作端)。将它插入待测温度的介质中;而热电偶的另一端(参比端或自由端)则与显示仪表相连。如果热电偶的测量端与参比端存在…

    2022年4月7日
    46
  • OpenAI Codex 使用 智谱 API

    OpenAI Codex 使用 智谱 API

    2026年3月12日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号