深度刨析指针Advanced 2

这篇具有很好参考价值的文章主要介绍了深度刨析指针Advanced 2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

目录

😠写在前面

🤬函数指针

😈两段有趣的代码

☠️函数指针数组

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

🤡回调函数


😠写在前面

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

🤬函数指针

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

深度刨析指针Advanced 2

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

test和&test的地址一样深度刨析指针Advanced 2

 test和&test的意义是一样的

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

深度刨析指针Advanced 2

但是,有一个地方得注意: *(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陷阱和缺陷》中看到的,大家有兴趣也可以去看看,里面有许多有趣的代码。

☠️函数指针数组

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

深度刨析指针Advanced 2

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

深度刨析指针Advanced 2

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

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

定义:

深度刨析指针Advanced 2

🤡回调函数

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

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

画图解释就是:

深度刨析指针Advanced 2


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

到了这里,关于深度刨析指针Advanced 2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言指针,深度长文全面讲解

    指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针? 指针解决了一些编程中基本的问题。 ✅指针的使用使得不同区域的

    2024年02月07日
    浏览(34)
  • 基于深度学习的指针式仪表倾斜校正方法——论文解读

    中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目:Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724/SP.J.1089.2020.18288.        针对仪

    2024年02月12日
    浏览(41)
  • 红黑树——原理刨析

            众所周知,红黑树是从AVLTree树中衍变而来的,所以在学红黑树之前还是要好好的理解一下AVLTree树的原理,为理解红黑树减轻理解负担,好了进入正题。         由名可知,红黑树——肯定是与颜色有关的一个树,又因为是从AVLTree树中衍化过来的,所以也是搜索树(

    2024年02月05日
    浏览(50)
  • 动态规划思想案例刨析

    动态规划的思想 动态规划解决问题的核心思想是“重叠子问题”和“最优子结构”。 重叠子问题 :在复杂问题中,往往存在许多重复的子问题。动态规划通过避免重复计算,将子问题的解保存起来,以便在需要时直接引用,从而提高效率。通过记忆化存储或者使用动态规划

    2024年01月17日
    浏览(26)
  • 深入刨析容器(二):容器的进程

    这章节主要是从容器的技术概念入手,说一下容器的基础,有了好的基础才能更好的理解容器这门技术,先说一下容器和进程的关系,后续的文章会说进程的隔离与限制资源以及容器的内部灵魂,来一点点深入容器,话不多说,那么开始把! 之前的章节说过容器就是一个“沙

    2024年02月09日
    浏览(37)
  • 【C++】map & set 底层刨析

    在 C++ STL 库中,map 与 set 的底层为红黑树,那么在不写冗余代码的情况下使用红黑树同时实现 map 与 set 便是本文的重点。 迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器,需要考虑以下问题: begin() 与 end() STL 明确规定,be

    2024年04月12日
    浏览(32)
  • 【C语言深度解剖】float变量在内存中存储原理&&指针变量与“零值”比较

    大家好好我是沐曦希💕 根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: (-1)^S * M * 2^E (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。 M表示有效数字,大于等于1,小于2。 2^E表示指数位。 例如: 十进制中的5.0转换成二进制

    2024年02月14日
    浏览(40)
  • C++函数传递数组方法及原理刨析

    当数组作为函数形参的时候,正确的写法如下: 上面两种写法都是正确的,之所以推荐用第一种写法,因为可读性更好一些,别人一眼就知道参数a是一个数组,而第二种写法不能直接看出a这个参数的意义。 有的同学就有疑问了,为啥两种写法都可以呢? 因为数组名字本身

    2024年02月09日
    浏览(41)
  • 深入刨析容器(一):容器的前世今生

    题外话,从左耳听风那里听到的话,技术的世界再变,你要找到不变的去学习,也就是说其实变来变去的只不过是外层理念封装的概念,实质的话本质还是基础,把基础打好才是无敌,这也点醒了我,要好好的学习基础知识,才能以不变应万变。 然后在极客时间溜达的时候,

    2024年02月09日
    浏览(38)
  • 深入刨析容器(三):容器的隔离与限制

    Docker容器因为还是共用的宿主机的内核,看似隔离了,其实还是隔离不彻底,只不过是被宿主机隐藏的进程,但是容器却没有虚拟机似的那么大消耗,虽然“敏捷”、“高性能”是容器较于虚拟机最大的优势,但是隔离不彻底也是它的最大缺点,共享内核那么暴露也会越多,

    2024年02月09日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包