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

C语言:函数指针的使用

在C语言中,函数指针是指向函数的指针变量。它可以存储函数的地址,使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法:

一、基本概念:

  1. 声明函数指针:

    returnType (*pointerName)(parameterTypes);

    这里 returnType 是函数返回类型,parameterTypes 是函数参数类型。例如:

    int (*add)(int, int); // 声明一个函数指针,指向接受两个int参数并返回int的函数。
  2. 初始化函数指针:

    add = ∑ // sum是一个函数,将其地址赋给add指针。

    或者更简洁的写法:

    add = sum; // &可以省略

二、用法示例:

#include <stdio.h>// 一个简单的函数
int sum(int a, int b) {return a + b;
}int main() {// 定义一个函数指针并初始化int (*add)(int, int) = sum;// 使用函数指针调用函数int result = add(3, 4);// 打印结果printf("Result: %d\n", result);return 0;
}

在这个例子中,add 是一个指向接受两个整数参数并返回整数的函数的指针。它被初始化为指向 sum 函数。之后,通过 add(3, 4) 调用了 sum 函数,结果被打印出来。

三、函数指针的用途:

  1. 回调函数: 允许传递函数作为参数,常用于实现回调机制,即将函数作为参数传递给另一个函数,使得在某个事件发生时调用这个函数。

    #include <stdio.h>// 回调函数
    void callbackFunction(int value) {printf("Callback: %d\n", value);
    }// 接受回调函数作为参数的函数
    void performOperation(int x, int y, void (*callback)(int)) {int result = x + y;callback(result);
    }int main() {// 使用回调函数performOperation(3, 4, callbackFunction);return 0;
    }
    

  2. 动态函数调用: 通过函数指针,可以在运行时动态地选择调用哪个函数,这样可以根据某些条件选择不同的实现。

    #include <stdio.h>int add(int a, int b) {return a + b;
    }int subtract(int a, int b) {return a - b;
    }int main() {int (*operation)(int, int);  // 声明一个函数指针// 根据条件选择函数int condition = 1;if (condition == 1) {operation = add;} else {operation = subtract;}// 使用函数指针调用函数int result = operation(5, 3);printf("Result: %d\n", result);return 0;
    }
    
    #include<stdio.h>int add(int x,int y)
    {return x+y;} int subtract(int x,int y)
    {return x-y;
    }int multiply(int x,int y)
    {return x*y;
    }//指针做函数参数
    int prosecc(int(*p)(int,int),int a,int b)
    {int P;P = (*p)(a,b);return P;}int main(void)
    {int num;num = prosecc(add,3,4);printf("Results: %d\r\n",num);num = prosecc(subtract,4,3);printf("Results: %d\r\n",num);num = prosecc(multiply,4,3);printf("Results: %d\r\n",num);return 0;
    }
    

  3. 函数指针数组: 可以创建存储函数指针的数组,实现类似分发器的功能,根据索引或条件选择调用不同的函数。

    #include <stdio.h>int add(int a, int b) {return a + b;
    }int subtract(int a, int b) {return a - b;
    }int multiply(int a, int b) {return a * b;
    }int main() {int (*operations[])(int, int) = {add, subtract, multiply};  // 函数指针数组// 使用函数指针数组调用不同的函数int result1 = operations[0](5, 3);  // 调用addint result2 = operations[1](5, 3);  // 调用subtractint result3 = operations[2](5, 3);  // 调用multiplyprintf("Results: %d, %d, %d\n", result1, result2, result3);return 0;
    }
    

  4. 函数指针作为结构成员: 可以将函数指针作为结构的一个成员,形成函数指针结构。

    #include <stdio.h>// 定义包含函数指针的结构
    struct Operation {int (*operation)(int, int);
    };// 使用结构中的函数指针
    int performOperation(struct Operation op, int a, int b) {return op.operation(a, b);
    }// 具体的函数实现
    int add(int a, int b) {return a + b;
    }int main() {// 初始化结构并使用函数指针struct Operation addition = {add};int result = performOperation(addition, 3, 4);printf("Result: %d\n", result);return 0;
    }
    

总的来说,函数指针是C语言中强大而灵活的特性,允许在运行时动态地选择调用哪个函数,从而提高代码的灵活性和可维护性。

相关文章:

C语言:函数指针的使用

在C语言中&#xff0c;函数指针是指向函数的指针变量。它可以存储函数的地址&#xff0c;使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法&#xff1a; 一、基本概念&#xff1a; 声明函数指针&#xff1a; returnType (*pointerName)(parameterTypes); 这里 r…...

「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 在web项目中使用DHTMLX Gantt时&#xff0c;开发人员经常需要满足与UI外观相关的各种需求。因此他们必须确定JavaScript甘特图库的…...

Webpack5入门到原理18:Plugin 原理

Plugin 的作用 通过插件我们可以扩展 webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin 工作原理 webpack 就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条…...

PWM之舵机

舵机又称直流电机&#xff0c;如下图 本节承接上节&#xff0c;具体的PWM技术已经在上一节讲的很详细了&#xff0c;本节就不再讲了&#xff0c;那么我们的重点就放在直流电机的工作原理上了。 一、工作原理 我们研究直流电机&#xff0c;主要式研究直流电机旋转速度的调节&a…...

Python并发与多线程:IO并发(阻塞IO、非阻塞IO、IO多路复用、异步IO)

在Python中&#xff0c;有多种处理并发的方式&#xff0c;其中之一就是使用多线程进行IO并发操作。在IO操作中&#xff0c;有四种常见的方式&#xff1a;阻塞IO、非阻塞IO、IO多路复用和异步IO。 阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;当执行一个IO操作时&…...

React16源码: React中的IndeterminateComponent的源码实现

IndeterminateComponent 1 &#xff09;概述 这是一个比较特殊的component的类型&#xff0c; 就是还没有被指定类型的component在一个fibrer被创建的时候&#xff0c;它的tag可能会是 IndeterminateComponent在 packages/react-reconciler/src/ReactFiber.js 中&#xff0c;有…...

SpringBoot:详解Bean生命周期和作用域

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、生命周期二…...

【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️线性表1.1 &#x1f514;线性表的定义1.2 &#x1f514;线性表的存储结构 二. ⛳️顺序表…...

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…...

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

第4周:Pytorch——综合应用和实战项目 Day 28-30: 学习资源和社区参与

第4周&#xff1a;综合应用和实战项目 Day 28-30: 学习资源和社区参与 在这个阶段&#xff0c;我们将探索更多的学习资源并鼓励参与PyTorch和TensorFlow的社区&#xff0c;以进一步提升技术和融入开发者社群。 学习资源&#xff1a; 论文&#xff1a;阅读最新的机器学习和深度…...

TypeScript教程(一)在vscode中的配置TypeScript环境

TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境 文章目录 TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境一、前言二、具体步骤1、Node.js安装2、TypeScript安装3、helloworld 一、前言 未来的开发者们请上座&#xff0c…...

sshpass的安装与使用

一.简介 1.定义&#xff1a; ssh 登陆不能在命令行中指定密码&#xff0c;sshpass 的出现则解决了这一问题。它允许你用 -p 参数指定明文密码&#xff0c;然后直接登录远程服务器&#xff0c;它支持密码从命令行、文件、环境变量中读取。 2.使用 sshpass 原因 使用 sshpass…...

Excel·VBA合并工作簿2

其他合并工作簿的方法&#xff0c;见之前的文章《ExcelVBA合并工作簿》 目录 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总举例 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总 与之前的文章《ExcelVBA合并工作簿&#x…...

linux内核原理--分页,页表,内核线性地址空间,伙伴系统,内核不连续页框分配,内核态小块内存分配器

1.分页&#xff0c;页表 linux启动阶段&#xff0c;最初运行于实模式&#xff0c;此阶段利用段寄存器&#xff0c;段内偏移&#xff0c;计算得到物理地址直接访问物理内存。 内核启动后期会切换到保护模式&#xff0c;此阶段会开启分页机制。一旦开启分页机制后&#xff0c;内…...

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言&#xff1a; 关于MongoDB的核心概念请移步&#xff1a; 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例&#xff0c;Linux版本的其实…...

k8s-pvc/pv扩容记录

背景 一次聊天过程中&#xff0c;对方提及pvc的扩容&#xff0c;虽然有注意过 storageclass 有个AllowVolumeExpansion的配置&#xff08;有些csi插件是不支持该配置的&#xff0c;比如local-volume-provisoner&#xff09;&#xff0c;但是没有实际用过&#xff0c;所以还是心…...

关于Unity插件TriLib使用的一点儿心得

最近做一个项目的时候&#xff0c;由于要求动态加载fbx或者glb等格式文件&#xff0c;而我们自己开发加载插件难度又有点大&#xff0c;所以最后使用了TriLib这个插件&#xff0c;现在说一点使用心得。 由于文件加载之后要对加载的内容进行复制&#xff0c;比如加载一个柱子&am…...

计算机二级Python基本排序题-序号45(补充)

1. 文件"singup.txt”中保存了若干条参加运动会学生的报名记录&#xff0c;每条记录的形式为“班级号_学号”&#xff0c;例如"A1_12”&#xff0c;将每个班级报名情按参加运动会人数从多到少排列&#xff08;假设不存在人数相同的情况&#xff09;并输出&#xff0c…...

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-6 fieldset

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>fieldset</title> </head><body> <form action"#"><fieldset><legend>学生信息</legend>姓名&#xff1a;&…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...