C语言 函数指针详解

一、函数指针

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.mfbz.cn/a/62805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …

SQLAlchemy快速使用

一、介绍 sqlalchemy是一个基于python实现的orm框架,跟web框架无关,独立的。 同步orm框架:django的orm(3.0以后支持异步)、sqlalchemy(大而重)、peewee(小而轻、同步和异步&#xf…

Netty 粘包半包

什么是 TCP 粘包半包? 假设客户端分别发送了两个数据包 D1 和 D2 给服务端,由于服务端一次读取到的字节 数是不确定的,故可能存在以下 4 种情况。 (1)服务端分两次读取到了两个独立的数据包,分别…

MyBatis查询数据库之一(概念+创建项目+基础交互)

目录 1.MyBatis是什么? 2.为什么学习MyBatis? 3. 怎么学 MyBatis 4.第⼀个MyBatis查询 4.1 添加MyBatis框架支持 4.1.1老项目添加MyBatis 4.1.2 新项目添加MyBatis 4.2 配置连接字符串和MyBatis 4.2.1 配置连接字符串 4.2.2 配置 MyBatis 中的…

python爬虫之scrapy框架介绍

一、Scrapy框架简介 Scrapy 是一个开源的 Python 库和框架,用于从网站上提取数据。它为自从网站爬取数据而设计,也可以用于数据挖掘和信息处理。Scrapy 可以从互联网上自动爬取数据,并将其存储在本地或在 Internet 上进行处理。Scrapy 的目标…

谈谈基因编辑技术

目录 1.基因编辑的概念 2.基因编辑技术的发展 3.基因编辑技术给人类带来的福利 1.基因编辑的概念 基因编辑是指通过人为干预,对生物个体的基因组进行特定的修改。这种技术使得科学家能够直接改变生物体的遗传信息,包括添加、删除或修改特定基因的DNA序…

为什么你一定要学会写作?

不管是写文章还是做短视频,也就是现在的自媒体,都有一个很大的好处: 写作是把自己的同一段时间重复销售很多很多次的极少选择之一,也是相对来看最容易成为普通人起步的台阶之一。 你写一篇文章,可能花了半天时间&…

uniapp点击图片放大预览

阐述 有些时候我们在用uniapp显示图片时&#xff0c;有的不宜全部显示到屏幕上&#xff0c;uniapp提供了一个非常好用的api。 实现方式如下&#xff1a; <template><view class"content"><image class"logo" src"/static/images/a.…

移动开发最佳实践:为 Android 和 iOS 构建成功应用的策略

您可以将本文作为指南&#xff0c;确保您的应用程序符合可行的最重要标准。请注意&#xff0c;这份清单远非详尽无遗&#xff1b;您可以加以利用&#xff0c;并添加一些自己的见解。 了解您的目标受众 要制作一个成功的应用程序&#xff0c;你需要了解你是为谁制作的。从创建…

Scala编程语言入门教程

Scala教程 方便个人学习和查阅 学习目标 Scala介绍 简介 Scala创始人Martin Odersky马丁奥德斯基 再回到我们的scala语言&#xff0c;在Scala官网https://www.scala-lang.org/介绍了其六大特征。 Java和scala可以混编 类型推测(自动推测类型) 并发和分布式&#xff08;Ac…

OLED透明屏采购指南:如何选择适合您需求的高品质产品

引言&#xff1a;OLED透明屏作为一种创新的显示技术&#xff0c;正在迅速发展并广泛应用于各个领域。 然而&#xff0c;面对市场上琳琅满目的OLED透明屏产品&#xff0c;如何选择适合自己需求的高品质产品成为了采购者们的重要任务。 对此&#xff0c;尼伽将为您提供一份OLED…

mybatis-plus的update方法,到底会不会更新null值?看这一篇就够了

普通的设置值。需要传入一个Wrapper对象 默认情况下是不会更新null值的&#xff0c;也就是只更新设置值的字段 LambdaUpdateWrapper<OrderChildRoom> orderChildRoomUpdateWrapper new LambdaUpdateWrapper<>();orderChildRoomUpdateWrapper.set(OrderChildRoo…

基于SqlSugar的开发框架循序渐进介绍- 基于MongoDB的数据库操作整合

SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架&#xff0c;支持多种数据库类型的接入&#xff0c;如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库&#xff0c;非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面&#xff0c;通过基类的继…

SPI通信协议

简介 SPI有主、从两种模式&#xff0c;通常由一个主模块和一个或多个从模块组成&#xff08;SPI不支持多主机&#xff09;&#xff0c;主 模块选择一个从模块进行同步通信&#xff0c;从而完成数据的交换。提供时钟的为主设备&#xff08;Master&#xff09;&#xff0c;接 收时…

AlamLinux 9 显示最小化按钮

AlamLinux 9 显示最小化按钮 默认情况下&#xff0c;AlamLinux 9 是没有最小化按钮的&#xff0c;在操作上会影响我们的工作效率。 想加上最小化按钮也非常简单&#xff0c;1行命令就能解决。 gsettings set org.gnome.desktop.wm.preferences button-layout ":minimize…

<dependency> idea中为什么这个变黄色

在IDE中&#xff0c;当你的代码出现黄色高亮时&#xff0c;通常表示存在警告或建议的提示。对于Maven的<dependency>标签来说&#xff0c;黄色高亮可能有以下几种原因&#xff1a; 依赖项未找到&#xff1a;黄色高亮可能表示IDE无法找到指定的依赖项。这可能是由于配置错…

Android中级——RemoteView

RemoteView RemoteView的应用NotificationWidgetPendingIntent RemoteViews内部机制模拟RemoteViews RemoteView的应用 Notification 如下开启一个系统的通知栏&#xff0c;点击后跳转到某网页 public class MainActivity extends AppCompatActivity {private static final …

面试热题(翻转k个链表)

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…

无涯教程-Lua - Modules(模块)

模块就像可以使用 require 加载的库&#xff0c;并且具有包含Table的单个全局名称&#xff0c;该模块可以包含许多函数和变量。 Lua 模块 其中一些模块示例如下。 -- Assuming we have a module printFormatter -- Also printFormatter has a funtion simpleFormat(arg) -- …

Godot 4 练习 - 制作粒子

演示项目dodge_the_creeps中&#xff0c;有一个Trail&#xff0c;具体运行效果 想要看看咋实现的&#xff0c;看完也不清晰&#xff0c;感觉是要设置某些关键的属性 ChatGPT说&#xff1a;以下是一些重要的属性&#xff1a; texture&#xff1a;用于渲染粒子的纹理。您可以使用…
最新文章