复习C语言指针---函数指针

2023-11-03

复习C语言指针—函数指针

函数

一个函数表达式其实是不存在直接的"()"操作符的,“()”操作符要求操作数是函数指指针(或者一些类类型)。
实际上,当用 f1(); 这样调用f1时,f1是函数名,“()”会先 f1 转换成函数指针,然后再作为“()”在操作符的操作数完成函数的调用。

函数指针

先简单定义一个函数,比如

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

这是一个实现两个相加的函数
而函数指针,就是指向这个函数的指针,可以通过解引用来调用这个函数
具体代码如下

(*p)表示是指针  (int,int)为指向函数的参数 int表示指向函数的返回类型

    int(*p)(int, int) = &Add;

注意:函数名可以代表函数的地址
代码如下:

    int(*p)(int, int) = &Add;
	int(*p1)(int, int) = Add;
	printf("%p\n", Add);
	printf("%p\n", &Add);

结果如下:
在这里插入图片描述
同时
又值得注意的一点是,函数指针的解引用是可以重复进行的
先看现象

    int(*p)(int, int) = &Add;
	printf("%p\n", *p);
	printf("%p\n", **p);
	//每一次解引用,都会将*p再转换成p
	//***p,经历3次解引用的隐式转换,又变成p了
	printf("%p\n", ***p)

在这里插入图片描述
原理如下:
正如最开始所说,函数名本身并不能调用函数,是()操作符把函数名转换成函数指针,然后才能调用函数。
而*p也是通过解引用得到函数名,然后编译器再隐式转换成函数指针,然后变成p。以此类推,***p是通过3次解引用,又转换成p

接下来是通过函数指针调用函数,(函数还是Add)
代码如下:

int ret = (*p)(3, 5);
	int ret1 = p(3, 5);
	int ret2 = (*****p)(3, 5);
	printf("%d\n", ret);
	printf("%d\n", ret1);
	printf("%d\n", ret2);

在这里插入图片描述

函数指针数组

将函数指针和指针数组结合

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

int Sub(int x, int y)
{
	return x - y;
}
int main()
{
	int(*p1)(int, int) = Add;
	int(*p2)(int, int) = Sub;

	//函数指针数组
	int(*ps1[2])(int, int) = { p1,p2 };

	return 0;
}

回调函数

回调函数
a函数的参数是函数指针,传入其他函数的地址,用这个函数指针接收,并用函数指针调用
可以减少很多重复的代码
比如计算器,可以用calc(int(*ps)(int,int))这个函数接收四则运算的函数

结束语

文章如果有不对或者不足的地方,欢迎大佬们指正,补充。感谢大家的阅读,如果感觉博主写的还可以,麻烦点个赞支持一下,阿里嘎多。拜托了,这对我真的很重要~
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复习C语言指针---函数指针 的相关文章

随机推荐

  • 设置cin不忽略空格

    cin读取字符是会忽略空格和换行的 可以用noskipws设为不跳过空格或者换行 char step cin gt gt noskipws gt gt step
  • ERROR 1045(28000):Access denied for user ‘root‘@‘local‘(using password:yes)问题解决

    首先出现这种问题一般是密码错误 但是也有可能 输入密码正确也显示报错的情况 笔者刚在Xshell中安装mysql 第二天输入了正确密码 我保证我输入的是正确的 出现此类报错 解决方法一般是重置密码 1 跳过MYSQL的密码验证过程 在Xsh
  • 蓝桥杯单片机学习过程记录(二十八)第五届国赛串口通信相关代码补充

    蓝桥杯单片机学习过程记录 二十八 第五届国赛串口通信相关代码补充 UART串口通信 第五届国赛uart串口内容相关补充 设置数组存储输入输入字符 并与设定的密码相判断 include
  • springboot2+shiro+redis限制同一账号同时在线人数

    springboot2 shiro redis限制同一账号同时在线人数 我们在写系统的时候 需要注意账号安全问题 最好的处理方法就是同一个账号只能在一个地方登录 原理 大概的原理就是每次登录的时候将登录的sessionId存入缓存 然后登录
  • c# 二维码生成

    dll下载 https pan baidu com s 1MDQalDEoV4iDXRYsEzDXtw 生成图片 此dll适合Framework版本较多 Imports ThoughtWorks QRCode Codec Dim qrCod
  • 技术人修炼之道阅读笔记(七)系统性思维方法

    在工作中有两种高手 一种是他们有成体系的逻辑 术法清晰 另一种是他们悟性高 对大多数人来说 前一种可借鉴性更高 但前提是要足够努力和坚持 塑造系统性思维并进行验证和升级 一 什么是系统性思维 系统性思维 是把物质系统当作一个整体进行思考的思
  • matlab 中num2str函数的使用

    参考 https zhidao baidu com question 431413920 html 问题描述 先前使用num2str函数只是使用了该函数最常用的功能 将数字转换为字符串 但其实该函数还有额外格式上的功能 今天使用图像批处理的
  • vue中使用echarts词云

    1 安装 cnpm install echarts wordcloud 2 创建模板组件 WordCloudChart
  • 自制Jlink OB

    简言 bin 2020 for 6 6 bin 适用最新版的Jlink驱动 6 6x版本号 关于修改SN 打开Jlink Commander 输入exec setsn xxxxxxxx即可修改成功 依据网上的资源 做了一些修改 将原来的输出
  • 快速排序及三种排序方法 Hoare法/挖坑法/前后指针法

    快速排序 算法思想 基于分治的思想 是冒泡排序的改进型 同冒泡排序一样 快速排序也属于交换排序 通过元素之间的比较和交换位置来达到排序的目的 不同的是 冒泡排序在每一轮只把一个元素冒泡到数列的一端 而快速排序在每一轮挑选一个基准元素 并让其
  • 高性能的Web网关,一个工具等于 Nginx + Https证书 + 内网穿透 + 图片切割水印 + 网关登录...

    一 开源项目简介 Apiumc Gateway 它一个工具等于 Nginx Https证书 内网穿透 图片切割水印 网关登录 Apiumc Gateway 是高性能的Web网关 它从底层Socket原始通信层开始 采用多线程 多任务模式从新
  • HyperMesh 2D网格划分

    Hypermesh具有很强的二维四边形网格划分能力 核心思想是将二维几何模型划分为一个个四边形区域 然后在四边形区域内进行进一步的网格划分 常用工具是Geom gt quick edit和2D gt automesh 下面举例看一下 1 常
  • 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0

    图文并茂使用CocosBuilder制作Cocos2D游戏 分享 0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创 翻译 Iven 张作宸 Butterfly 手把手教你使用CocosBuilder
  • 广东公需科目公需课十四五答案考试查询器

    QQ录屏20200723111627 效果看上面这个视频 其中需要data pkl文件 这上面无法上传 如果的可以联系我发给你 博客头像边上有我wx号 import pickle file open data pkl rb data pic
  • 010 - STM32学习笔记 - SysTick系统定时器

    010 STM32学习笔记 SysTick系统定时器 1 SysTick简介 SysTick是属于Cortex M内核的一个外设 嵌套在NVIC中 系统定时器是一个24位的递减计数器 每次计数事件位1 SYSCLK 在F429中之前配置的S
  • 最多变的混合模式-实色混合HardMix

    最多变的混合模式 实色混合HardMix 之前写过一篇介绍27种图层混合模式的非常详细 如果你想完全了解底层的原理 这篇文章不会让你失望 PS图层混合模式超详细解答 图层混合模式的原理 王先生的副业的文章 知乎 https zhuanlan
  • 合并两个无序数组java_Java实现把两个数组合并为一个的方法总结

    Java实现把两个数组合并为一个的方法总结 发布时间 2020 10 25 10 40 46 来源 脚本之家 阅读 76 作者 jaycee110905 本文实例讲述了Java实现把两个数组合并为一个的方法 分享给大家供大家参考 具体如下
  • 数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

    MATLAB 读取数字字符串混杂的文本文件txt中的数据 目标 介绍 纯数字的情况 需要读取的文本文件 判断文件路径 matlab 读取数据的结果 代码块 文字开头 数字在后的情况 需要读取的文本文件 matlab 读取数据的结果 代码块
  • cmake--编译器设置

    前言 cmake支持多种不同方式设置编译器标志 1 使用 target compile definitions 设置编译器标志 2 使用CMAKE C FLAGS和CMAKE CXX FLAGS设置编译标志 一 目录结构 CMakeList
  • 复习C语言指针---函数指针

    复习C语言指针 函数指针 文章目录 复习C语言指针 函数指针 函数 函数指针 函数指针数组 回调函数 结束语 函数 一个函数表达式其实是不存在直接的 操作符的 操作符要求操作数是函数指指针 或者一些类类型 实际上 当用 f1 这样调用f1时