C语言——函数指针——函数指针变量(详解)

函数指针变量

函数指针变量的作用

函数指针变量是指向函数的指针,它可以用来存储函数的地址,并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面:

  1. 回调函数:函数指针变量可以作为参数传递给其他函数,从而实现回调函数的功能。当某个条件满足时,可以通过函数指针调用相应的回调函数,实现特定的功能。

  2. 动态选择函数:通过函数指针变量,可以在运行时根据不同的条件选择不同的函数执行。这样可以提高程序的灵活性和可扩展性。

  3. 函数的别名:函数指针变量可以作为函数的别名使用,可以简化代码,提高代码的可读性。

  4. 实现函数表:通过将多个函数的指针存储在一个数组或者结构体中,可以实现函数表。通过索引或者其他方式,可以方便地调用相应的函数。

 ——————————————————————————————————————————

 函数指针变量语法格式 

这里和指针数组 

———————————————————————————————————————————

函数指针变量的定义和举例

函数指针是指向函数的指针变量。它可以用来存储函数的地址,从而可以通过指针调用函数。函数指针的定义方式如下:

返回类型 (*指针变量名)(参数列表);

其中,返回值类型是函数的返回值类型,指针变量名是函数指针的名称,参数列表是函数的参数类型和个数。

下面是一个函数指针的示例:

例如,我们有一个函数 add,它接受两个整数参数并返回它们的和。我们可以声明一个函数指针 p 来指向该函数:
int add(int a, int b) {return a + b;
}int (*p)(int, int);  // 声明一个函数指针变量pp = add;  // 将函数add的地址赋值给pint result = p(3, 4);  // 通过函数指针调用add函数在上面的例子中,我们声明了一个返回类型为 int,参数列表为 (int, int) 的函数指针 p。然后,我们将函数 add 的地址赋值给了 p,最后通过 p 调用了 add 函数并将结果赋给了 result。函数指针在实际应用中非常有用,可以用于实现回调函数、动态加载库中的函数等场景

———————————————————————————————————————————

函数指针变量语法格式的讲解

数组指针->指针->指向数组的->存放的是数组的地址
&数组名是数组的地址
数组名是数组首元素的地址,两个地址的值是一样的!

对于首元素的理解不深入的 ,可以看一下这一篇文章 

指针数组和数组指针(详细解释)-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/136581096

pf专门 用来存放地址 

 按照函数指针的格式来进行书写,就变成函数指针

这里是语法是相互对应的 

 这里的括号是不能去掉的,虽然pf是变量名字,但是那个括号是不能去掉的

去掉*pf外面的括号的话

pf就变成了名字不再是代表指针函数数组

而是变成,表示一个函数的声明,该函数返回一个返回值类型的指针变量。

所以,这里的语法格式是不能改变的

所以,这样也是可以的

函数指针变量函数名的调用和函数指针调用的对比

函数名调用

拿一个数值进行接收,直接传参 

函数指针的调用

此时pf的*和()可以写也可以不写

并且函数名本身就等于调用的函数,类似于重命名

最后打印接收的返回值

——————————————————————————————————————————————————————————————————————————————————————

补充知识  

强制类型转化

作用

C语言中的强制类型转换是一种将一个数据类型转换为另一个数据类型的操作。它可以通过显式地指定要转换的数据类型来实现。强制类型转换可以用于以下几种情况:

  1. 改变变量的数据类型:当需要将一个变量的数据类型从一种类型转换为另一种类型时,可以使用强制类型转换。例如,将一个整数转换为浮点数,或者将一个字符转换为整数。

  2. 提升数据类型:当进行表达式计算时,如果参与计算的操作数具有不同的数据类型,C语言会自动进行隐式类型转换,将较低精度的操作数提升为较高精度的操作数。但是有时候我们需要手动进行提升,以确保计算结果的准确性。

  3. 缩小数据类型:有时候我们需要将一个较高精度的数据类型转换为较低精度的数据类型,这时候就需要使用强制类型转换。需要注意的是,缩小数据类型可能会导致数据丢失或溢出,因此需要谨慎使用。

强制类型转换的语法如下:

(目标类型) 表达式

其中,目标类型是要转换成的数据类型,表达式是要进行转换的值或变量。

需要注意的是,强制类型转换可能会导致数据的精度丢失或溢出,因此在使用时需要谨慎考虑。此外,过度使用强制类型转换可能会导致代码可读性降低,建议在必要的情况下使用。

 举例

C语言中的强制类型转换是一种将一个数据类型转换为另一个数据类型的操作。它可以通过使用强制类型转换运算符来实现,即将要转换的数据类型放在要转换的值或表达式前面,用括号括起来。

例如,将一个整数类型转换为浮点类型可以使用强制类型转换。下面是一个示例:int num = 10; float result = (float)num;在上面的示例中,我们将整数类型的变量num强制转换为浮点类型,并将结果赋给浮点类型的变量result。

需要注意的是,强制类型转换可能会导致数据丢失或精度损失。因此,在进行强制类型转换时,需要谨慎考虑数据类型之间的兼容性和可能的副作用。

具体举例 

函数的返回类型

强制类型转化的语法 

——————————————————————————————————————————————————————————————————————————————————————

typedef  

typedef类型重命名

这里一笔带过 ,在指针2里面讲的很清楚,结构体和结构体的重命名

结构体详解-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/136477956指针篇章-(2)-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/136408404

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

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

相关文章

拿捏算法的复杂度

目录 前言 一:算法的时间复杂度 1.定义 2.简单的算法可以数循环的次数,其余需要经过计算得出表达式 3.记法:大O的渐近表示法 表示规则:对得出的时间复杂度的函数表达式,只关注最高阶,其余项和最高阶…

【音视频开发好书推荐2】《FFmpeg 音视频开发基础与实战》

1、多媒体处理开源库FFmpeg概述 享有盛名的音视频多媒体处理开源库FFmpeg,做过音视频编解码开发的同学基本都用过,即便没做过这方面开发,也会听说过这个开源库。 FFmpeg是目前最全面的开源音视频编解码库,包括常用的音视频编码协议…

JavaScript原型和原型链

JavaScript每个对象拥有一个原型对象 需要注意的是,只有函数对象才有 prototype 属性 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索&#xff…

C++指针(五)完结篇

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三)、C指针(四)万字图文详解! 本篇博客是介…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

物联网电气融合实训室建设方案

1 教学实训总体设计 1.1 建设背景 (一)政策推动与战略部署 近年来,物联网技术在全球范围内得到了广泛的关注和应用。作为信息技术的重要组成部分,物联网在推动经济转型升级、提升社会管理水平、改善民生福祉等方面发挥着重要作…

python实现桶排序

排序算法: python实现基数排序 python实现归并排序 python实现交换排序 python实现选择排序 python实现插入排序 python实现桶排序 桶排序(Bucket Sort)是一种排序算法,它将待排序的元素分到有限数量的桶(buckets&…

Ps:清理

清理 Purge命令位于“编辑”菜单下,它主要用于释放 Photoshop 使用的内存资源,有助于提高系统的性能。 通过使用“清理”命令,用户可以有效管理 Photoshop 的资源使用,特别是在处理大型文件或进行长时间编辑会话时。 定期清理可以…

python 基础知识点(蓝桥杯python科目个人复习计划61)

今日复习内容:想到什么复习什么 因为比赛用到的编辑器是IDLE,所以从现在开始,我就不用pycharm了。 例题1: 从1到2020的所有数字中,有多少个2? 这个题是一个填空题,我用的方法是先在编辑器上…

第14章 西瓜书——概率图模型

概率图模型 概率图模型(Probabilistic Graphical Model)是用图结构来表示多元随机变量之间条件依赖关系的模型。在图模型中,节点表示随机变量,边表示变量之间的依赖关系。概率图模型可以分为有向图模型(如贝叶斯网络&a…

Oracle VM VirtualBox安装Ubuntu桌面版

背景:学习Docker操作 虚拟机软件:Oracle VM VirtualBox 7.0 系统镜像:ubuntu-20.04.6-desktop-amd64.iso 在Oracle VM VirtualBox新建一个虚拟电脑 选择好安装的目录和选择系统环境镜像 设置好自定义的用户名、密码、主机名 选择一下运行内…

交易平台开发:构建安全/高效/用户友好的在线交易生态圈

在数字化浪潮的推动下,农产品现货大宗商品撮合交易平台已成为连接全球买家与卖家的核心枢纽。随着电子商务的飞速发展,一个安全、高效、用户友好的交易平台对于促进交易、提升用户体验和增加用户黏性至关重要。本文将深入探讨交易平台开发的关键要素&…

Mac使用自动操作(Automator)发送文件到Android设备

需求场景 在Android开发调试的过程中,当需要把电脑上的文件传输到连接的Android设备时,通常的做法是通过adb push命令。那既然是通过命令操作,是否可以通过可视化的工具来操作呢?例如在Finder中,右击某一个文件或者目…

软件测试相关内容第三弹--软件测试基础

写在前:在前篇的两篇博客介绍中我们主要学习软件测试的相关概念,对软件测试进行了初步的了解,本篇博客将进一步进行学习。重点内容包括:软件测试的生命周期、如何描述一个bug、如何定义bug的级别、bug的生命周期以及在实际工作中如…

数学建模【时间序列】

一、时间序列简介 时间序列也称动态序列,是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分,分别是描述过去、分析规律和预测未来,本篇将主要介绍时间序列分析中常用的三种模型:季节分解…

多线程扫盲篇

一:前言 多线程在java中具有举足轻重的地位,无论是平时开发中还是面试求职中,对多线程这一块的知识点考察都非常多的,本周我们将平时开发中、面试中常见的一些多线程知识进行梳理,让大家对这一块有更加深入的理解 二…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

armv8/armv9不同特权程序之间的跳转模型

目录 1、前言2、4个特权等级/4个安全状态之间的跳转模型3、启动时镜像之间的跳转模型4、runtime程序之间的跳转模型推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,secur…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子,谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署(迁移)项目时发现,项目的excel导出功能报错,错误如下…

html--彩虹马

文章目录 htmljscss 效果 html <!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>Rainbow Space Unicorn</title> <link rel"stylesheet" href"css/style.css"> &l…