深度刨析指针Advanced 2

news2024/9/28 5:32:30

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《系统解析C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《C语言》《算法详解》《C语言-语法篇》

内容分享:本期对C语言中的指针的进阶知识进行进行具体讲解,各位看官姥爷快搬好小板凳坐好叭。

    -------- 不要998,不要98,只要一键三连,三连买不了吃亏,买不了上

目录

😠写在前面

🤬函数指针

😈两段有趣的代码

☠️函数指针数组

👻指向函数指针数组的指针

🤡回调函数


😠写在前面

接上一篇的文章,接下来我们将对函数指针,函数指针的数组,指向函数指针数组的指针,回调函数进行具体的分析,在学习这些内容之前,我认为这些知识是可有可无的,应用场景非常少。但是在学完之后发现并不是这样,所以各位还是请耐心看看叭。

🤬函数指针

我们在前面的内容中,学习到了整型指针,字符指针,数组指针,那函数指针又是怎么定义的呢?

 在这里,我们就要思考了:&test 和test是一样的地址吗,它们的arr,&arr有区别吗?

test和&test的地址一样

 test和&test的意义是一样的

通过结果我们可以发现int(*padd)(int,int) = add 也可以得到结果,所以它们的意义一样,于arr,&arr有区别。且我们通过代码可知道:函数调用用add,(*padd),padd都可以得到结果。

但是,有一个地方得注意: *(padd)(2, 3),这样子是不可以的,它存放不了指针。它是先和(2,3)结合,再和*结合。

😈两段有趣的代码

//代码1
(*(void (*)())0)();
//代码2
void (*signal(int, void(*)(int)))(int);

 解析:

//代码1
(*(void (*)())0)();

//调用0地址处的函数 
// 返回类型是void 无参数

//1. void(*)()  是一个函数指针类型
// 返回类型是void 没有参数
//2. (void(*)())0 将0强制类型转化为函数地址
//3. *(void(*)())0 将0地址进行了解引用操作 找到0地址处的函数
//4. (*(void (*)())0)() 函数调用 调用0的地址的函数 

//代码2
void (*signal(int, void(*)(int)))(int);

//这是一个函数声明 该函数的返回类型是函数指针 参数是int和函数指针

//1. void(*)(int) 函数指针类型 返回类型是void 参数是int类型
//2. sianal(int, void(*)(int)) sianal是一个函数名 参数是int 和一个 函数指针
//3. void (*signal(int, void(*)(int)))(int); sianal 的返回类型也是一个函数指针
//该指针返回类型是void 参数是int

这些“奇葩的代码”是在《C陷阱和缺陷》中看到的,大家有兴趣也可以去看看,里面有许多有趣的代码。

☠️函数指针数组

数组是一个存放同类型数据的存储空间,在之前的文章类里,我们已经学习了指针数组。

把一个函数的地址放到一个数组中,那这个数组就是叫函数指针数组。它的定义方式如下: 

👻指向函数指针数组的指针

函数指针数组指针,顾名思义,它是一个指针,这个指针指向一个数组,且指向的这个数组里面元素的类型是函数指针类型。

定义:

🤡回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当 这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调 用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

通俗的讲就是:一个函数的地址给另一个函数做参数,在执行的过程中用到了这个参数就回到那个函数运行,得到的结果再返回来。

画图解释就是:


到这里,我们对C语言指针的内容已经全部学完啦。通过初阶和进阶的知识,这些足以支撑我们以后的学习。接下来在想提高对指针的理解大家只有去通过刷题和一些项目来拔高对它的理解啦。后面还会有一篇对指针练习题的讲解,大家敬请期待叭。

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

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

相关文章

使用omp并行技术加速最短路径算法-迪杰斯特拉(Dijkstra)算法(记录最短路径和距离)

原理: Dijkstra算法是解决**单源最短路径**问题的**贪心算法** 它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径 直到求出从源点到其他各个顶点的最短路径。 首先假定源点为u,顶点集合V被划分为两部分:集合…

stable-diffusion-webui的介绍与使用——Controlnet1.1

源码地址:https://github.com/lllyasviel/ControlNet | 最新版本 controlnet-v1.1 论文地址:2302.Adding Conditional Control to Text-to-Image Diffusion Models 扩展UI地址(需先安装sd-webui):https://github.com/M…

基于对Element UI的表单验证

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🪀从以下源码中介绍:🎀这里是官网源码 🐒个人主页 🏅JavaEE系列专栏 📖前言: 本篇博客主要以介绍基…

杂记——FDA获批的AI超声产品

目前,人工智能算法在医学图像领域发展迅猛。相对于CT、MRI等,人工智能在超声图像处理领域仍处于起步阶段。近年来,多项研究利用深度学习、计算机视觉和图像处理等技术,对超声图像进行自动化分析、识别和量化,提供辅助医…

Golang的pprof性能分析

文章目录 一、pprof 概述二、服务开启pprof1、代码中引用pprof2、服务开启一个端口,用来监听pprof 三、使用pprof采集CPU耗时1、调用流程图2、查看火焰图 四、使用pprof分析内存泄漏问题查看当前程序的内存占用查看goroutine的运行时间 五、性能优化案例背景1、压测…

WIFI中的频段、信道、信道带宽

一、波长、波速与频率 波长波速/频率 “波速”由“介质”决定。 “频率”由“波源”决定。 “波长”由“介质”(波速V)、“波源”(频率f)共同决定。(λV/f) 波长(wavelength): 指波在一个振动周期内传播的距离。也就…

【正点原子STM32连载】 第三十二章 光敏传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第三十…

【网络面试必问】浏览器如何委托协议栈完成消息的收发

接上一篇:【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换  在前面的博客中,提到过无数次,浏览器作为应用程序,本身是不具备向网络中发送网络请求的能力,要委托操作系统的内核协议栈来完成。协议栈再调用…

新手学习Vmp之控制流程图生成

新手学习Vmp之控制流程图生成 控制流程图的生成对于反混淆分析来说是非常重要的一步,这里记录一下我研究的过程,以Vmp2为例子。 这里我的环境准备如下: Visual Studio IDA SDK Capstone Unicorn Graphviz IDA SDK插件环境,主要是有一些AP…

1.2数据机构——算法和复杂度

一、算法 1、概念:算法是对特定问题求解的一种描述(或步骤),是指令的特定序列 2、程序数据结构算法 3、算法的特性: 有穷性:算法是有穷的,程序是无穷的 确定性:每条指令有确定的…

一文搞懂什么是Raid

RAID 1. 基本概念2. RAID 03. RAID 14. RAID 015. RAID 56. RAID6 1. 基本概念 RAID(Redundant Array of Independent Disks)是一种磁盘阵列技术,通过将多个物理磁盘组合成一个大容量的逻辑磁盘,提高磁盘存储的性能和可靠性。 R…

TOGAF 标准对数字化企业支持

这篇来点高大尚的,对技术、产品管理者和架构师写方案应该有用,其它不多谢,直接转入正题。 一、概述 TOGAF标准是在需要购买服务器硬件和网络设备的时候开始发展的;需要规划数据中心空间、电源和冷却,并协商和购买产品…

微服务SpringCloudday1 认识微服务与服务注册(Eureka与nacos)

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

arduino w801 流水灯

先复制个图过来 来源 https://www.cnblogs.com/milton/p/15621540.html 前两天老外跟联盛德网站回复我arduino库有完善的了 GitHub - board707/w80x_arduino: w806 for arduino ide package arduino 添加库地址 https://raw.githubusercontent.com/board707/w80x_arduino/ha…

【genius_platform软件平台开发】第九十八讲:嵌入式网络接口(MAC、PHY)

1. 嵌入式网络简介 1.1 嵌入式下的网络硬件接口 提起网络,我们一般想到的硬件就是“网卡”,现在网卡已经是通过一个芯片来完成了,嵌入式网络硬件分为两部分:MAC和PHY,大家都是通过看数据手册来判断一款SOC是否支持网络…

Linux tar.xz 格式的文件正确的解压命令

Linux tar.xz 最近下载 Linux kernel,好像最近流行 tar.xz 格式的后缀 对于 xz 后缀的压缩文件,我之前的解压方式是分为两步: xz -d xxx.tar.xz 解压成 xxx.tar 格式文件,然后再 tar xf xxx.tar 解压文件。 这样的操作不仅比较的…

【Java基础学习打卡11】Path环境变量的配置

目录 前言一、为什么配置环境变量二、如何配置环境变量三、JDK11的环境变量配置总结 前言 本文我们要知道为什么配置环境变量,自己思考不配置环境变量可以吗?JDK 11 如何配置环境变量。 一、为什么配置环境变量 原因很简单,就是方便命令的查…

痛点-调研-明确需求-实现-测试-发布 不需要手一步到位使用AGI生成去广告脚本,复制粘贴发布到Greasy Fork

总算又想起密码了, 自从用了语雀后, 其他平台基本都不再使用了 csdn 真的**, c h a t g p t 是禁词(已经改为了AGI, 通用型人工智能), 你倒是说清楚啊,直接来一句违反社区规定, 莫名其妙, 得靠猜…服了 今天来补上一篇利用AGI生成的js去广告脚本 前置知识(不看也问题不大) …

MyBatis junit 日志框架logback

JUnit是专门做单元测试的组件 <!-- junit依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>…

牛客网最全的 Java 面试八股文大合集汇总

就目前大环境来看&#xff0c;跳槽成功的难度比往年高很多。一个明显的感受&#xff1a;今年的面试&#xff0c;无论一面还是二面&#xff0c;都很考验 Java 程序员的技术功底。这不马上又到了面试跳槽的黄金段&#xff0c;成功升职加薪&#xff0c;不成功饱受打击。当然也要注…