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/734175.shtml

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

相关文章

三菱PLC基础指令

LD指令(a触点的逻辑运算开 指令表程序 0000 LD X000 0001 OUT Y000 LDI指令(b触点的逻辑运算开 指令表程序 0000 LDI X000 0001 OUT Y000 3.数据寄存器(D)的位指定*1(仅对应FX3u,FX3uc可编程控制器) 指令表程序 0000 LD D0.3 0001 OUT Y000 4.定时器 0000 LDI X00…

Objects类 --java学习笔记

Objects类 Objects是一个工具类,提供了很多操作对象的静态方法给我们使用 Objects类常用的三个方法 Objects.equals 比直接equals更安全,因为Objects.equals里面做了非空校验 Objects.isNull(A) 等价于 A null Objects.non…

Redisson学习

简介 Redisson 是一个在 Redis 的基础上实现的 Java 驻留内存数据网格(In-Memory Data Grid)。它提供了许多分布式 Java 对象和服务,包括分布式锁、分布式集合、分布式执行服务、分布式调度任务等。 使用 依赖 相关依赖,注意版…

【兔子机器人】修改GO电机id(软件方法、硬件方法)

一、硬件方法 利用上位机直接修改GO电机的id号: 打开调试助手,点击“调试”,查询电机,修改id号,即可。 但先将四个GO电机连接线拔掉,不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…

回溯算法12-全排列II(Java/排列数去重操作)

12.全排列II 题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出&…

Spring Boot整合zxing实现二维码登录

zxing是google的一个二维码生成库,使用时需配置依赖: implementation("com.google.zxing:core:3.4.1") implementation("com.google.zxing:javase:3.4.1") zxing的基本使用 我们可以通过MultiFormatWriter().encode()方法获取一个…

AI预测福彩3D第3弹【2024年3月6日预测】

书接上回,经过连续两期使用人工神经网络对福彩3D进行预测,经过不断的调参优化,并及时总结规律,感觉还是有一定的信心提高七码的命中概率。 今天,咱们继续来验证,直接上今天的统计结果,首先&…

手写分布式配置中心(五)整合springboot(不自动刷新的)

springboot中使用配置方式有四种,分别是environment、BeanDefinition、Value、ConfigurationProperties。具体的原理可以看我之前的一篇文章https://blog.csdn.net/cjc000/article/details/132800290。代码在https://gitee.com/summer-cat001/config-center 原理 …

移动端uni-app小程序搜索高亮前端处理,同时可设置相关样式,兼顾性能

在uni-app中我们会遇到搜索高亮显示的需求 如下图: 起初用的是富文本实现 使用replaceAll方法取代搜索字段为一个 标签并设置相应的样式,但是小程序的并没有把 标签渲染出来,所以放弃了,下面原代码: /* 搜索字体变色…

C++进阶:详细讲解继承

现在也是结束了初阶部分的内容,今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼,立刻赶来“战场”的是进阶部分里的继承 文章目录 1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1继承的格式1.2.2再讲访问限定符(详讲protected)1.2.3**继承…

NFT交易市场开发(一)

实现的基本功能 (一) 发行一个符合ERC20标准的测试Token,要求如下: 总量::1亿精度:18名称:Fake USDT in CBI简称:cUSDT (二) 发行一个符合ERC72…

数据结构——算法的空间复杂度

【本节内容】 1.空间复杂度 2.常见空间复杂度 1.空间复杂度 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用额外存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算…

random标准模块

一、概述 在 Python 中,random 是一个内置模块,用于生成随机数。它提供了各种用于生成随机数的函数,包括伪随机数生成器、随机序列操作等。 1、需要导包 不会自动导入,需要显示的将random模块导入 import random2、源码分析&…

课时59:流程控制_if条件控制_语法解读

2.2.1 语法解读 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 条件结构能够根据某个特定的条件,结合内置的测试表达式功能,结合测试的结果状态值对于条件进行判断,然后选择执行合适的任务…

【Greenhills】MULTIIDE集成第三方的编辑器进行源文件编辑工作

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 在使用GHS进行工作的时候,可以集成第三方的编辑器进行源文件编辑工作 2、 问题场景 用于解决在GHS中进行项目开发时,对于GHS的编辑器使用不习惯,想要切换到其他第三方的编辑…

为什么在镀膜时要测薄膜折射率?

在芯片制造中,镀膜工序(PVD,CVD)是必不可少的关键环节,薄膜的质量直接影响了芯片的性能。对这些薄膜的精细控制又离不开对其折射率的深入理解和精确测量。今天将对芯片制造中薄膜折射率的概念、测量方法,以及它在整个制…

Arcgis小技巧【19】——更改字段顺序

一、问题分析 一般情况下,一个合格且严谨的要素或表数据,它的字段顺序都是固定的。 比如三调数据,正常的字段数据如下(截取部分字段): 数据经过处理,如增删字段,可能会出现字段顺序…

SAM模型

SAM与过去分割对比 根据以下Demo,我们可以发现,通过在图像中指定要分割的内容提示,SAM可以实现各种分割任务,且无需额外的训练、做到零样本泛化,即SAM学会了辨别物体、具备图像理解力、对不熟悉的图像和物体能进行零样本概括&…

论文阅读《FENET: FOCUSING ENHANCED NETWORK FOR LANE DETECTION》

ABSTRACT 受人类驾驶专注力的启发,这项研究开创性地利用聚焦采样(Focusing Sampling)、部分视野评估(Partial Field of View Evaluation)、增强型 FPN 架构和定向 IoU 损失(Directional IoU Loss&#xff…

STM32单片机示例:ETH_LAN8742_DHCP_NonOS_Poll_H743

文章目录 目的基础说明关键配置关键代码示例链接总结 目的 以太网是比较常用到的功能,STM32系列单片机使用CubeMX配置使用以太网功能比非常方便。不过对于H7系列来说需要使能 DCache 才能启用LwIP,启用Cache后又会带来一些需要特别注意的事情。这篇文章…