C语言 函数指针详解

news2024/10/3 4:38:46

一、函数指针

1.1、概念

函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址

示例:

int Add(int x,int y)
{
	return x+y;
 }
int main()
{
	printf("%p\n",&Add);//打印一下函数Add()的地址
	printf("%p\n",Add);//数组名等于数组首元素地址,那函数名是等于函数地址吗?
	return 0;
}

函数名是等于函数地址的!

1.2、函数指针的使用方法

函数指针的定义函数的返回值类型(*指针名)(函数的参数列表类型

int Add(int x, int y)
{
	return x+y;
}

int main()
{
 	int (*pf)(int, int) = &Add;//函数指针定义,返回值类型和参数类型与函数Add()相同
}

1.3、怎么使用函数指针去调用函数呢?

void Add(int x, int y){
    return x+y;}

int main(){
    int (*pf)(int,int)=&Add;
    int ret=(*pf)(3,5);
}

解析:
        int ret=(*pf)(3,5),此时就相当于通过函数名调用: int ret=Add(3,5);},我们又知道:函数名是等于&函数名的,所以int (*pf)(int,int)=&Add,可改成:int (*pf)(int,int)=Add;此时Add等价于pf,所以:int ret=(*pf)(3,5);语句可改成:int ret=pf(3,5);等价于int ret=Add(3,5),故我们知道了对于:int ret=(*pf)(3,5);语句来说,*是没有意义的,有一个或多个或者没有都不影响;
 

二、阅读两段有趣的代码

注:来源于《c陷阱和缺陷》;

1.( *(void( *)( ))0 )( )
解析:
这段代码的含义是:

(1)调用0地址处的函数
(2)该函数无参数,返回值是void
(3)拆分:
·     ·●void()() 表示函数指针类型
     ··●( void()() )0 表示对0进行强制类型转换,把0强制类型转换成一个函数的地址;如(int)3.14
··     ●* ( void()() )0 表示对0地址处的函数进行了解引用操作
      ··●( ( void(*)() )0)() 则表示调用0地址处的函数
(4)请看图解:
在这里插入图片描述

 

2.void (* signal(int,void( * )( int ) ) )(int)
解析:

(1)signal和()先结合,说明signal是一个函数名
(2)signal函数第一个参数的类型为int,第二个参数的类型为函数指针,该函数指针指向一个参数为int,返回值为void的函数;
(3)signal 函数的返回类型也是一个函数指针,该函数指针,指向一个参数为int,返回值为void函数
(4)请看图解:
在这里插入图片描述

综上,signal是一个函数声明;
 


 

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

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

相关文章

Linux tcpdump 命令详解

简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…

MPLS(下)

LDP --- 标签分发协议 --- 主要应用在MPLS的控制层面 MPLS控制层面需要完成的工作主要就是分配标签和传递标签。分配标签的前提是本地路由表中得先存在标签,传递标签的前提也是得先具备路由基础。所以,LDP想要正常工作,则需要IGP作为基础。 …

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中,我们介绍了关于如何去操作Docker镜像,下面我们来看看如何去操作容器。 简单来讲,容器是镜像运行的一个实例,与镜像不同的是镜像只能作为一个静态文件进行读取,而容器是可以在运行时进行写入操…

嵌入式的日常工作内容是什么?

1、看器件文档 2、找供应商要资料 3、打电话或微信联系供应商了解技术或器件细节 4、忍受门外汉领导连环夺命吹,因为他们不懂技术,只会问进度 5、写技术文档 6、跟硬件工程师联合测试,查看电路板未工作状态各种问题。有时还要自己手动DI…

tomcat通用回显

​Tomcat架构简析 tomcat的架构图 Server:整个tomcat启动的时候只有一个server Service:一个server中包含了多个service,表示服务 **Container:**容器,可以看作是一个servlet容器,包含一些Engine,Host,Context,Wraper等,访问的路径什么的就存放在这里 Engine -- 引擎 Host …

搞个个人博客,纯学习想找个纯html模板咋就这难

以前做毕业设计的时候老想找一些不掺杂后端代码的前端模板。 可是下载下来,不是php就是python后台的。看又看不懂,想换语言就必须先把里面的后台代码拿掉。 就很像买了个精装的二手房,白白多花了砸墙钱。 就比如,想做个带菜单的…

编写SPI_Master驱动程序_新方法

编写SPI_Master驱动程序_新方法 文章目录 编写SPI_Master驱动程序_新方法一. SPI驱动框架1.1 总体框架1.2 怎么编写SPI_Master驱动1.2.1 编写设备树1.2.2 编写驱动程序 二、 编写程序2.1 数据传输流程2.2 写代码 致谢 参考资料: 内核头文件:include\lin…

vsphere6.5 创建数据中心、集群和添加主机

1、新建数据中心,在入门页面选择创建数据中心,名称可以自定义。 2、创建完成数据中心后就可以添加主机和创建集群了。 3、新建一个集群,并打开DRS和HA功能,这两个功能的一些其他选项可以在创建完成后进一步设置,关于EV…

我能“C“——扫雷游戏

一.前言: 扫雷游戏,一款经典的游戏,没玩过的话也可以试着玩一玩,这样对写扫雷游戏这个小游戏的化是会有一个很好的思路的。那么本片博客就来介绍如何实现扫雷游戏的具体步骤。扫雷游戏链接👉 扫雷游戏网页版 - Minesw…

人工智能在推动生产力上的分析

像ChatGPT这样的大型语言模型正在成为强大的工具,不仅可以提高工人的生产力,还可以提高创新率,为经济增长的显著加速奠定基础。作为一项通用技术,人工智能将影响广泛的行业,促进对新技能的投资,改变业务流程…

DWG图纸在SOLIDWORKS软件里如何使用?

经常有工程师咨询DWG图纸在SOLIDWORKS软件里如何使用,其实这涉及到DWG图纸在SOLIDWORKS软件里的重用问题,SOLIDWORKS支持对DWG图纸的重用,常用的有三种方法: 1.作为原始DWG图纸查看作为原始DWG图纸查看是指使用SOLIDWORKS软件直接…

Nginx使用proxy_cache指令设置反向代理缓存静态资源

场景 CentOS7中解压tar包的方式安装Nginx: CentOS7中解压tar包的方式安装Nginx_centos7 tar文件 怎么load_霸道流氓气质的博客-CSDN博客 参考上面流程实现搭建Nginx的基础上,实现静态资源的缓存设置。 注意上面安装时的目录是在/opt/nginx目录下&…

Python编程从入门到实践练习第四章:对列表进行操作

本文目录 一、 创建数值列表1.1 使用range创建数字列表涉及方法使用实例输出 1.2 列表解析1.3 练习题代码输出 二、对列表部分元素进行操作2.1 切片使用实例 2.2 复制列表2.3 练习题代码输出 三、元组3.1 元组介绍3.2 练习题代码输出 一、 创建数值列表 1.1 使用range创建数字…

理解Android生命周期

写一个demo,实现两个页面之间的跳转。重写7个生命周期方法,在方法中打印日志,观察状态的变化。 MainActivity 设置一个常量。 private static final String TAG "hello_activity_1";重写7个生命周期。 在生命周期方法中&#…

No primary or single unique constructor found for interface java.util.List

报错截图: 报错内容: 2023-08-04 15:46:32.884 ERROR 14260 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fa…

对当下AI的一些观感思考

目前来看,AI技术地震的震中还是在美帝那旮瘩。尤其是M7,这几家市值加总快15万亿美元了,个个都是行业翘楚,个个都有拿得出手的东西。AI是个技术密集、人才密集、计算密集的产业。美帝拥有全球一流的顶尖人才,以及财力、…

【Leetcode】(自食用)树的中序遍历(递归+栈非递归)

step by step. 题目: 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入…

【LNMP】LNMP

LNMP:是目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件;能够提供静态页面服务,也可以提供动态web服务 L Linux系统,操作系统N Nginx网站服务,前端,提供前端的静态…

接口抓包,Fiddler抓包使用方法总结,入门到精通辅助实战...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 工作原理 Fiddle…

性能全面飙升!StarRocks 在贝壳找房的极速统一实践

小编导读: 贝壳找房是国内最大的在线房产交易平台之一,利用大数据技术进行房源的挖掘和匹配,通过数据分析和挖掘,更准确地了解用户需求,并为用户提供个性化的房源推荐和交易服务。 随着数据和业务规模的增长&#xff0…