当前位置: 首页 > news >正文

C语言中的函数指针、指针函数与函数回调

在C语言中,指针是一个核心概念,它提供了直接访问内存地址的能力。指针不仅可以指向变量,还可以指向函数,这为编程带来了极大的灵活性。本文将通过示例代码详细介绍C语言中的函数指针、指针函数以及函数回调。

1. 指针函数

指针函数,顾名思义,就是返回值为指针的函数。这意味着函数返回的不再是一个普通的值,而是一个指向某个数据类型的指针。

示例代码:

#include <stdio.h>// 指针函数:返回值为指针
int* test(int* a) {return a;
}int main() {int a = 10;int* p = test(&a); // 调用指针函数,返回a的地址printf("%d\n", *p); // 输出a的值printf("%d\n", *test(&a)); // 直接调用指针函数并解引用,输出a的值return 0;
}

在上面的示例中,test 函数接受一个 int 类型的指针作为参数,并返回这个指针。在 main 函数中,我们定义了一个整型变量 a,然后调用 test 函数获取 a 的地址,并通过返回的指针访问 a 的值。

2. 函数指针

函数指针是一种指向函数的指针变量。在C语言中,函数名实际上就是一个指向函数首地址的指针。我们可以定义一个函数指针变量,让它指向某个函数,然后通过这个函数指针来调用函数。

示例代码:

#include <stdio.h>// 普通函数
int sum(int a, int b) {return a + b;
}int main() {// 函数指针:指向函数的指针变量int (*pf)(int, int) = sum; // pf 是一个指向接受两个int参数并返回一个int的函数的指针printf("%d \n", pf(1, 2)); // 通过函数指针调用函数return 0;
}

在上面的示例中,我们定义了一个函数指针 pf,让它指向 sum 函数。然后,我们通过 pf 来调用 sum 函数,并输出结果。

3. 函数回调

函数回调是一种将函数作为参数传递给另一个函数,并在需要时由另一个函数调用的机制。在C语言中,我们可以通过函数指针来实现函数回调。

示例代码:

#include <stdio.h>// 普通函数
int sum(int a, int b) {return a + b;
}// 回调函数使用
int cal(int (*p)(int, int), int a, int b) {return p(a, b); // 调用传递进来的函数
}int main() {// 函数回调int (*op)(int, int) = sum; // 定义函数指针int res = cal(op, 90, 80); // 将函数指针作为参数传递给cal函数,实现回调printf("%d \n", res);return 0;
}

在上面的示例中,我们定义了一个 cal 函数,它接受一个函数指针和两个 int 类型的参数。在 main 函数中,我们定义了一个函数指针 op,让它指向 sum 函数,然后将 op 作为参数传递给 cal 函数。在 cal 函数内部,我们通过函数指针 p 调用了传递进来的函数,实现了函数回调。

总结

本文介绍了C语言中的指针函数、函数指针和函数回调的概念和用法。通过示例代码,我们可以看到这些概念在实际编程中的应用。指针函数可以返回指向某个数据类型的指针,函数指针可以指向某个函数并通过指针来调用函数,而函数回调则是一种将函数作为参数传递并在需要时调用的机制。这些概念在C语言中非常重要,掌握它们可以帮助我们编写更加灵活和高效的代码。

相关文章:

  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件
  • ref和reactive, toRefs的使用
  • 【RL】Basic Concepts in Reinforcement Learning
  • Day01-变量和数据类型课后练习-参考答案
  • 《C程序设计》上机实验报告(六)之函数及其应用
  • BC107 矩阵转置
  • 踩坑实录(First Day)
  • SpringBoot之整合PageHelper分页插件
  • 代码随想录算法训练营DAY14 | 二叉树 (1)
  • vue3 之 组合式API—computed
  • 代码随想录算法训练营第四十一天| 343. 整数拆分、96.不同的二叉搜索树
  • 忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际
  • 【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?
  • LeAPI 后端接口开发 - 发布、下线接口
  • 导出pdf 加密、加水印、加页脚
  • php的引用
  • 【EOS】Cleos基础
  • 【剑指offer】让抽象问题具体化
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular 2 DI - IoC DI - 1
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Docker容器管理
  • Git的一些常用操作
  • java中的hashCode
  • Odoo domain写法及运用
  • PV统计优化设计
  • ReactNative开发常用的三方模块
  • React系列之 Redux 架构模式
  • 构造函数(constructor)与原型链(prototype)关系
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 记一次删除Git记录中的大文件的过程
  • 前端js -- this指向总结。
  • 试着探索高并发下的系统架构面貌
  • 推荐一个React的管理后台框架
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 在Unity中实现一个简单的消息管理器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Linux(帮助手册)
  • %@ page import=%的用法
  • (C语言)共用体union的用法举例
  • (js)循环条件满足时终止循环
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Ruby)Ubuntu12.04安装Rails环境
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十三)Flask之特殊装饰器详解
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)SpringBoot3---尚硅谷总结
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)linux下的时间函数使用
  • (转)关于pipe()的详细解析
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net6使用Sejil可视化日志
  • .NET中winform传递参数至Url并获得返回值或文件
  • @html.ActionLink的几种参数格式