​ 在 C 语言中,函数也是一种“对象”,它在内存中有地址。因此可以定义指向函数的指针,用于动态调用、回调处理、构建函数表等。

        掌握函数指针是理解 C 语言“底层抽象”与“模块化编程”的关键。


一、函数指针的基本概念

        ​ 函数指针是一个变量,用于存储函数地址。通过它可以像调用普通函数一样间接调用函数


示例:普通函数

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

函数名 add 实际就是函数在内存中的地址。


函数指针定义语法

返回类型 (*函数指针名)(参数类型1, 参数类型2, ...);

示例:定义与赋值

int (*fp)(int, int);   // 定义指针
fp = add;              // 或写成 fp = &add;
int result = fp(2, 3); // 间接调用函数

二、函数指针的使用场景

场景描述
回调机制注册函数供其他代码异步调用
策略选择多种处理方式中选择其一
接口抽象封装模块细节
表驱动编程构建函数数组替代大量 if/else

三、函数指针数组

用于存储一组函数地址,实现快速查表式调用。

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }int (*ops[2])(int, int) = {add, sub};

调用:

printf("%d\n", ops[0](5, 3)); // 输出 8
printf("%d\n", ops[1](5, 3)); // 输出 2

四、函数指针作为参数(回调函数)

将函数指针作为参数,实现在函数中回调用户传入的逻辑。

void compute(int x, int y, int (*op)(int, int)) {printf("Result: %d\n", op(x, y));
}

调用:

compute(10, 5, add);  // 输出 15
compute(10, 5, sub);  // 输出 5

五、typedef 简化函数指针声明

函数指针语法复杂,可以用 typedef 提高可读性。

typedef int (*Operation)(int, int);Operation op = add;
printf("%d\n", op(1, 2));  // 输出3

也适用于参数定义:

void compute(int x, int y, Operation f) {printf("%d\n", f(x, y));
}

六、返回函数指针的函数(高阶函数)

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }typedef int (*OpFunc)(int, int);OpFunc getOp(char ch) {if (ch == '+') return add;else return sub;
}int main() {OpFunc f = getOp('+');printf("%d\n", f(3, 2));  // 输出5
}

七、使用函数指针实现菜单系统(实战)

#include <stdio.h>void show()   { printf("Show\n"); }
void insert() { printf("Insert\n"); }
void del()    { printf("Delete\n"); }void (*menu[])(void) = {show, insert, del};int main() {int choice;while (1) {printf("0: Show, 1: Insert, 2: Delete\n");scanf("%d", &choice);if (choice >= 0 && choice < 3)menu[choice]();elsebreak;}return 0;
}

八、函数指针 vs 一般指针

特性一般指针(如 int*)函数指针
指向类型数据地址(变量、数组等)函数地址
赋值方式p = &ap = arrfp = funcfp = &func
调用方式*pfp(x, y)
应用领域数据访问回调、策略、多态

九、常见错误和注意事项

错误类型示例正确方式
忘记加括号int *f(int,int);int (*f)(int,int);
参数列表不匹配int (*f)(int);f(1,2) 调用确保参数类型和数量一致
未初始化直接调用int (*f)(int,int); f(1,2);调用前确保指针有效
误用数组下标超范围fp[3](); 超出数组范围控制索引,避免越界

十、函数指针的实际意义

  • 提高代码灵活性和可扩展性;

  • 模拟面向对象的“多态”机制;

  • 在驱动、GUI库、游戏引擎中广泛使用。


十一、总结

内容说明
定义函数指针int (*f)(int,int)
指针数组int (*arr[])(int,int)
回调函数把函数指针作为参数
typedef 简化声明typedef int (*Op)(int,int)
高阶函数返回函数指针、构建策略函数
函数指针用途回调机制、函数表、策略模式等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88647.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88647.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88647.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速傅里叶变换(FFT)是什么?

快速傅里叶变换(FFT)是什么&#xff1f; 快速傅里叶变换&#xff08;FFT&#xff09; 本质上是一种极其高效的算法&#xff0c;用来计算**离散傅里叶变换&#xff08;DFT&#xff09;**及其逆变换。它是数字信号处理、科学计算和工程应用中最重要的算法之一。 要理解 FFT&…

EEG分类 - Theta 频带 power

在EEG&#xff08;脑电图&#xff09;信号处理的背景下&#xff0c;theta波段功率&#xff08;Theta Band Power&#xff09;是一个重要的特征&#xff0c;广泛应用于认知、神经科学和临床监测等领域。接下来&#xff0c;我将详细介绍theta波段功率的定义、特性、计算方法以及在…

苍穹外卖day3--公共字段填充+新增菜品

1.公共字段填充 1.1 问题分析 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表中都会有这些字段…

每次选择都是成本

概述 我们每个人都在做选择&#xff0c;而且无时无刻不在做选择。 有的人有的选&#xff0c;而有的人却没得选。 因此从侧面来说&#xff0c;有的选反而更是一种幸福。 我们学习的目的就是为了让我们自己在未来能有更好地选择&#xff0c;也可以底气十足地选择不去做什么&a…

AI in CSR Writing: Revolutionizing Clinical Trial Reports

一、AI在CSR撰写中的实际应用 1.1 自动化数据整合与报告生成 1.1.1 数据提取与汇总 AI自动从EDC、实验室系统、安全数据库提取数据,生成统计图表和表格,如人口统计学、疗效终点、安全性事件表,减少人工操作。 1.1.2 动态报告生成 基于预设模板,AI自动填充数据结果,如自动…

《Java反射到底该不该用?性能、灵活性与可维护性三者博弈》

大家好呀&#xff01;今天我们要聊一个Java中超级强大但也需要谨慎使用的特性——反射机制(Reflection) &#x1f3ad;。我会用最通俗易懂的方式&#xff0c;带大家彻底搞懂这个"程序界的魔术师"&#xff01; 一、什么是Java反射&#xff1f;&#x1f914; 想象一下…

从Java API调用者到架构思考:我的Elasticsearch认知升级之路

前言&#xff1a;我的Elasticsearch学习历程 作为一名Java开发者&#xff0c;记得第一次使用ES的Java High Level REST Client时&#xff0c;我被它强大的搜索能力所震撼&#xff0c;但也为复杂的集群调优所困扰。经过多个项目的实战积累和系统性学习&#xff0c;我终于建立了对…

高云GW5AT-LV60 FPGA图像处理板

GW5AT-LV60开发板体积小巧&#xff0c;长100mm宽为61.8mm&#xff0c;还没有一部Ipone SE2体积大&#xff0c;该板卡采用了核心板和载板分离的形式&#xff0c;核心板的形式可方便开发者在项目中根据实际需求来开发自己的载板&#xff0c;只需要为核心板提供5V的电源就能满足基…

[XILINX]ZYNQ7010_7020_软件LVDS设计

若该文为原创文章&#xff0c;未经允许不得转载风释雪QQ:627833006WX:Cheng18375816918CSDN博客: 风释雪FPGA知乎&#xff1a;风释雪FPGA 1.版本说明 日期作者版本说明2024xxxx风释雪初始版本 2.概述 ZYNQ 7010/7020 HR/HP Bank LVDS Rx/TX&#xff1b; 3.目标 ZYNQ 7010 LVD…

桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏

飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上占用…

SpringCloud Gateway 组件的使用

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 我发现了一个很有意思的缩写单词 gw、wg&#xff0c;都是网关的意思。因为 gw gateway、wg wangguan&#xff0c;所以在各个系统开发中&#xff0c;既有 gw 也有 wg 的存在。而网关…

随机地址生成器 - Cloudflare Workers

分享一个完全开源免费部署在 Cloudflare Workers 上的随机地址生成器&#xff0c;支持全球 24 个国家/地区。 &#x1f517; 工具地址: https://address.chat-tempmail.com ✨ 特性 &#x1f30d; 支持生成 24 个国家/地区的地址&#x1f4f1; 响应式设计&#xff0c;完美支持…

CNN不是一个模型?

CNN不是一个模型&#xff1f; 结论&#xff1a; CNN 是模型架构而非具体模型&#xff0c;其定位类似深度学习领域的 「设计框架」&#xff0c;而非 LSTM&#xff08;具体单元结构&#xff09;或决策树&#xff08;具体算法实体&#xff09;。CNN 的 「具体模型」 需要结合网络…

爱基百客与真迈生物达成战略合作,共推多组学科研服务升级

近日&#xff0c;武汉爱基百客生物科技有限公司&#xff08;以下简称“爱基百客”&#xff09;与真迈生物正式签署战略合作协议。此次战略合作将聚焦表观组学、单细胞时空组学等前沿科研领域&#xff0c;联合打造基于自主创新技术的多组学科研服务方案&#xff0c;为科研人员提…

吴恩达:从斯坦福到 Coursera,他的深度学习布道之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 吴恩达&#xff1a;从斯坦福到 Coursera&#xff0c;他的深度学习布道之路 在人工智能…

开疆智能CCLinkIE转ModbusTCP网关连接测联无纸记录仪配置案例

本案例是通过CCLinkIE转ModbusTCP网关将记录仪数据传送到三菱PLC&#xff0c;具体操作过程如下。 &#xff08;1&#xff09; 无纸记录仪与PT100传感器连接正确后&#xff0c;将无纸记录仪和PC通过网线连接&#xff0c;给无纸记录仪上电&#xff0c;设置无纸记录仪的IP地址及网…

【软考高级系统架构论文】# 论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

Spring Boot 3.x 项目搭建 (一)

以下是一个基础 Spring Boot 项目的创建指南&#xff0c;整合了官方推荐方式和实用配置&#xff0c;帮助您快速搭建可运行的项目骨架。 &#x1f31f; 一、项目创建方式 1. 在线工具 Spring Initializr&#xff08;推荐&#xff09; 步骤&#xff1a; 访问 Spring Initializr…

《天行数据查询系统项目介绍》

一、项目概述 天行数据查询系统是一款功能丰富的 Android 应用程序&#xff0c;旨在为用户提供便捷的信息查询服务。该系统集成了多个实用的查询功能&#xff0c;包括空气质量查询、天气预报查询、垃圾分类查询、新闻资讯浏览以及身份证信息查询等&#xff0c;方便用户一站式获…

对于服务器企业该如何进行搭建?

企业搭建服务器能够实现网络服务、数据存储和管理等功能&#xff0c;选择大家服务器不仅能够实现高效的资源管理和对数据信息进行安全保护&#xff0c;还可以满足网站运行的需求&#xff0c;下面&#xff0c;小编就主要来为大家介绍一下企业该如何进行服务器搭建&#xff1f; 搭…