• 【指针数组】【数组指针】【函数指针】【函数指针数组】【回调函数】你都会吗



    前言

    上篇文章简单介绍了【指针】的初级知识,知道了指针的概念:

    1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
    2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
    3. 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
    4. 指针的运算。

    对以上这些不是很熟悉的,或者没有看过上一篇文章的小伙伴,建议看完指针初阶的介绍再看本篇噢

    接下来将讨论【指针】的高级主题


    提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处还请多多指点~ 废话不多说,直接上干货!下面案例可供参考

    一、字符指针

    在C语言中,是没有一个数据类型能够存储字符串的,那么只有两种方式能够存储指针:字符类型的数组字符指针

    字符数组很好理解,就是把字符串的每一个字符都存放在数组中
    字符指针指的是:将字符串的首字符地址存放在一个指针中,指针的类型是char类型

    我们看下面这段代码:
    在这里插入图片描述

    二、指针数组

    在这里插入图片描述

    三、数组指针

    1.理解数组指针

    在这里插入图片描述
    在这里插入图片描述
    了解了数组指针,我们来看数组指针如何使用:
    (一般在二维数组中使用,下面案例仅供参考)
    在这里插入图片描述

    2.辨析:数组指针&指针数组

    我们先辨析文字:

    数组指针:(以指针结尾)是一个指针,指针指向数组
    指针数组:(以数组结尾)是一个数组,数组存放指针


    下面来辨析代码:

    在这里插入图片描述

    3.数组传参解析

    在这里插入图片描述

    四、函数指针

    强调一个知识点:函数名就是函数地址

    记住咯,来看代码:
    在这里插入图片描述

    特别注意:
    198 行处 *pf 的星号只是表明 pf 是一个指针, pf 存放 Add 的地址,所以 pf == &Add
    而函数名就是函数地址,所以 &Add 可以直接替换成 Add 所以 pf == Add
    199 行处 *pf的星号是解引用操作符,对 pf 解引用得到 Add 函数的地址,也就是 Add,刚刚说过 Add == pf ,所以这里的解引用操作符没有实际意义

    五、函数指针数组

    1.理解函数指针数组

    在这里插入图片描述
    有了指针指针数组的铺垫,以及认识了函数指针,相信大家不难理解函数指针数组


    来看函数指针数组的定义方式:
    在这里插入图片描述

    2.使用函数指针数组

    我们先来看一段实现【计数器】的基本写法:

    在这里插入图片描述
    这段代码没有任何语法错误和逻辑错误,仅仅利用了switch语句+调用了几个简单的函数

    但是大家会看到,switch语句中的case语句中多次出现了一些重复且功能相同的代码,我们把这种现象称为代码冗余


    我们仔细看一下冗余的代码片段,都是在执行调用某个函数

    那如果我们把这些函数放在一个数组中,利用下标,配合case语句的“1、2、3、4”,就可以直接从数组中找到想要的函数,从而避免代码冗余。

    来看代码如何写:
    在这里插入图片描述

    六、回调函数

    之前发布的【函数】初阶的文章中提到了回调函数,由于当时没有讲指针,所以答应大家在【指针】这篇会讲到,现在它来啦!
    如果对函数这一章节 “链式访问” “嵌套” “递归”不是很熟悉的话可以看看介绍函数的这篇文章

    话说又说回来,什么是回调函数?


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

    说人话:
    就是有两个函数:函数 A ,函数 B ,把 A 的地址传参给 B ,在 B 函数中调用 A

    B 函数中调用了 A ,就去执行 A ,如果 A 有返回值,返回值返回到 B 中

    刚刚再将函数指针数组的时候,为了避免【计数器】代码中的冗余,使用了函数指针数组,现在再介绍另一种更优的避免代码冗余的方式:就是回调函数


    还记得那段代码冗余的原因吗:调用加减乘除函数的时候重复的代码太多

    我们再学习【函数】的时候,函数的意义不就是:避免重复造轮子
    所以面对重复的代码,最优的解法就是把它们写成一个函数

    问题又来了,这里面我们确实需要根据情况不同去选择调用加减乘除,根据已有的知识储备似乎也没法写成某个函数诶

    所以我们来学习一下回调函数
    在这里插入图片描述
    浅浅总结一波就是:
    将 ”选择“ 这段代码写成 choose 函数,在 choose 函数 return 的地方调用加 / 减 / 乘 / 除去计算,算完了以后把结果 return 给 choose函数 ,choose 函数再 return 给 main 函数。


    总结

    以上就是今天要讲的关于【指针】的进阶内容,干货满满,小伙伴们也要注意辨析:指针数组数组指针函数指针函数指针数组
    在后续各位学习数据结构【线性表】的时候还会经常用到二级指针以及结构体指针结构体数组指针等等,所以指针很重要!!!

    如果你目前能把本片的内容都理解,吃透,你一定超过了绝大多数人!!
    如果哪些地方有疑问,欢迎评论区讨论~

    如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦~


    上山总比下山辛苦
    下篇文章见

  • 相关阅读:
    【性能测试】服务端中间件docker常用命令解析整理(详细)
    nodejs 16版本
    (附源码)spring boot企业网站设计与实现 毕业设计 211750
    RFM实战:基于使用RFM+R模型量化用户价值进行金融产品精准营销
    职场人,面试逃不过的灵魂三问
    蓝桥等考Python组别十三级005
    部署轻量级Gitea替代GitLab进行版本控制(一)
    修改YOLOv5的模型结构第二弹
    如何快速实现一个颜色选择器
    Ubuntu20.04沉浸式装机
  • 原文地址:https://blog.csdn.net/yzhcjl_/article/details/127662213