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语言中强大而灵活的特性,允许在运行时动态地选择调用哪个函数,从而提高代码的灵活性和可维护性。

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

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

相关文章

13.1 一个简单的基类

们在类中添加新特性。 继承是种非常好的概念,其基本实现非常简单。但要对继承进行管理,使之在所有情况下都能正常 工作,则需要做…些调整。本章将介绍继承简单的一面和复杂的一面。 - 13.1 一个简单的基类 从个类派生出另一个类时,原始类称为基类,继承类称为派生类。为说明继…

浅析云服务oss/obs/cos对象存储安全攻防

文章目录 前言云存储服务1.1 初识对象存储1.2 腾讯云COS桶1.3 公开读取风险 对象存储桶风险2.1 Bucket Object遍历2.2 Bucket 名称的爆破2.3 Bucket ACL可读写2.4 任意写与文件覆盖2.5 Bucket 域名的接管 AccessKey凭证泄露3.1 行云管家接管主机3.2 Github泄露AK/SK3.3 客户端程…

【题目】2023年国赛信息安全管理与评估正式赛任务书-模块2

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块二 网络安全事件响应、数字取证调查、应用程序安全 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为13:30-16:30。 【注意事项】 比赛结束&#xff0c;不得关机&#xff1b;选手首先…

Chatgpt+Comfyui绘图源码说明及本地部署文档

其他文档地址&#xff1a; ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码线上部署文档 一、源码说明 1、源码目录说明 app_home&#xff1a;app官网源码chatgpt-java&#xff1a;管理后台服务端源码、用户端的服务端源码chatgpt-pc&#xff1a;电脑网页前端源码cha…

两条链表相同位数相加[中等]

优质博文IT-BLOG-CN 一、题目 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这…

【征服Redis12】redis的主从复制问题

从现在开始&#xff0c;我们来讨论redis集群的问题&#xff0c;在前面我们介绍了RDB和AOF两种同步机制&#xff0c;那你是否考虑过这两个机制有什么用呢&#xff1f;其中的一个重要作用就是为了集群同步设计的。 Redis是一个高性能的键值存储系统&#xff0c;广泛应用于Web应用…

【React】Redux的使用详解

文章目录 Redux的三大原则Redux官方图react-redux使用 1、创建store管理全局状态​ 2、在项目index.js根节点引用 3、 在需要使用redux的页面或者组件中&#xff0c;通过connect高阶组件映射到该组件的props中 redux中异步操作如何使用redux-thunkcombineReducers函数 Re…

数据结构和算法笔记4:排序算法-归并排序

归并排序算法完全遵循分治模式。直观上其操作如下&#xff1a; 分解&#xff1a;分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决&#xff1a;使用归并排序递归地排序两个子序列。合并&#xff1a;合并两个已排序的子序列以产生已排序的答案。 我们直接来看例子…

Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel

前言 本文主要讲解&#xff0c;使用不同的 Channel 让 Flutter 和 Android原生 进行通信&#xff0c;由于只是讲解两端通信&#xff0c;所以可视化效果不好&#xff1b; 不过我写了一篇专门讲解 Flutter 嵌入 Android原生View的文章 Flutter 页面嵌入 Android原生 View-CSDN…

小程序使用echarts图表-雷达图

本文介绍下小程序中如何使用echarts 如果是通过npm安装&#xff0c;这样是全部安装的&#xff0c;体积有点大 我这边是使用echarts中的一个组件来实现的&#xff0c;下边是具体流程&#xff0c;实际效果是没有外边的红色边框的&#xff0c;加红色边框的效果是这篇说明 1.echa…

IDEA的database使用

一、数据据库 在使用database之前&#xff0c;首先你的电脑要安装好了数据库并且启动。 MySQL卸载手册 链接&#xff1a;https://pan.baidu.com/doc/share/AVXW5SG6T76puBOWnPegmw-602323264797863 提取码&#xff1a;hlgf MySQL安装图解 链接&#xff1a;https://pan.baidu.…

机器学习笔记——机器学习的分类

1 机器学习是啥 机器学习是人工智能的一个分支&#xff0c;它是一门研究机器获取新知识和新技能&#xff0c;并识别现有知识的学问。 机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA 序列测…

用Python实现Excel中的Vlookup功能

目录 一、引言 二、准备工作 三、实现Vlookup功能 1、导入pandas库 2、准备数据 3、实现Vlookup功能 4、处理结果 5、保存结果 四、完整代码示例 五、注意事项 六、总结 一、引言 在Excel中&#xff0c;Vlookup是一个非常实用的函数&#xff0c;它可以帮助我们在表…

Web概述

Web 概述&#xff1a;Web是World Wide Web的简称&#xff0c;是一个由许多互联网服务组成的信息空间。它由超文本文档、图像、视频和其他多媒体资源组成&#xff0c;并通过超文本传输协议&#xff08;HTTP&#xff09;进行传输。特点&#xff1a;Web的主要特点是其开放性和可访…

java数据结构与算法刷题-----LeetCode485. 最大连续 1 的个数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 法一&#xff0c;双指针2. 法二&#xff1a;变量计数 1. 法一…

Unity 面试篇|(八)Unity机试篇 【全面总结 | 持续更新】

目录 1.假设当前市场价一只鸡10元&#xff0c;一只鸭12元5角。请写一个函数ShowPrice&#xff0c;输入参数分别为鸡和鸭的个数&#xff08;非负整型&#xff09;&#xff0c;功能为显示出总价钱&#xff0c;精确到分。例如调用ShowPrice&#xff08;5,10&#xff09;后输出175.…

63 C++ 多线程 timed_mutex,recursive_timed_mutex

前提 &#xff1a;以往的mutex如果拿锁子拿不到&#xff0c;就会一直等待。 timed_mutex 和 recursive_timed_mutex则不同&#xff0c;这两个提供了方法&#xff0c;可以不一直等待。 try() 方法--mutex 和 timed_mutex 都有&#xff0c;且说明都一样 bool try_lock();(C11 起)…

vant组件库的简单使用

1. 组件库的选择 组件库并不是唯一的&#xff0c;常用的组件库还有以下几种&#xff1a; pc 端:element-uielement-plus iviewelement-plus iviewant-design移动端&#xff1a;vant-uiMint UI (饿了么)Cube UI (滴滴)… 2. vant组件库 主要参考官网&#xff1a;Vant官网 3…

面对不平衡二元分类问题是否需要使用SMOTE技术?

摘要 在训练分类模型之前平衡数据是解决表格数据中不平衡二元分类任务的流行技术。平衡通常是通过复制少数样本或生成合成少数样本来实现的。虽然众所周知&#xff0c;平衡对每个分类模型的影响不同&#xff0c;但大多数先进的实证研究并未将强大的最先进&#xff08;SOTA&…

python实例100第30例:一个5位数,判断它是不是回文数

题目&#xff1a;一个5位数&#xff0c;判断它是不是回文数。即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。 程序分析&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。 程序源代码&#xff1a; #!/usr/bin/pyt…