码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言基础篇 —— 3-2 一文秒懂函数指针


    文章目录

      • 函数指针含义
      • 函数指针表达式
      • 函数指针的定义与使用
      • 函数指针解析
      • 函数指针应用
      • 函数指针,数组指针,普通指针 在内存中的分布图


    函数指针含义

    函数指针的实质是一个指针变量,这个变量本身占4个字节(在32位系统中)
    函数的实质是一段代码,这段代码在内存中是一段连续分布的内存空间。对于函数中最关键的函数第一个地址(找到函数第一地址就能找到整个函数代码),这个函数首地址在C语言中就由函数名来表示。
    指针(函数指针,数组指针,普通指针)的实质都是指向一段内存空间,内存空间中存储的内容各自不同(对于函数指针就是一段代码;对于数组指针就是数组;对于普通变量就是变量内存空间)

    再解释下函数指针这个含义: 函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的值)

    函数指针表达式

    为什么C语言中会存在复杂的变量类型?
    C语言本身是强类型语言(每个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查错误。所有的指针变量都是一样的,但是C语言中存在不同类型的指针,这些指针指向变量/数组等(int *p、int (*p)[5] ),这些符号给编译器提供更多的信息,让编译器检查这个变量在代码中的应用,如果编译器检查到类型不匹配就会报错。

    注意: 不是所有的语言都是强类型语言的,也存在弱类型的语言(Shell、Makefile等),在弱类型语言中所有的变量没有自己的变量类型。

    函数指针的定义与使用

    假设有个函数为void func(void),对应的函数指针为void (*p)(void)。 ———— 函数指针定义
    p = func; ————函数指针赋值
    p(); ———— 函数指针调用

    注意: 在C语言编译器中定义,函数名做右值的时候加不加&效果和意义都是一样的。

    函数指针解析

    void (*Pfunc)(char *, const char *)

    分析:核心为Pfunc ; 根据C语言中符号的优先级(()的优先级比 * 的高)。与核心最近的 * 符号先结合,表示这个Pfunc是一个指针。(*Pfunc)整体再与()结合表示这个指针指向的是函数。所以整个符号表示的是函数指针。

    分析方法与步骤可参考:C语言基础篇 —— 3-1 一文秒懂指针数组与数组指针

    函数指针应用

    结构体内部内嵌函数指针实现分层
    复杂的程序东西太多一个人搞不定,需要更多人协同工作完成。在linux复杂的内核程序中用了很多这种分层(上层和下层)写代码的思想和方法。
    上层注重的是实现业务逻辑,与我们最终的目标直接光联,并没有具体干活的函数
    下层注重的是实际干活的函数,注重上层填充的变量,并将变量传递给上层中的函数来完成任务。

    函数指针,数组指针,普通指针 在内存中的分布图

    在这里插入图片描述

  • 相关阅读:
    OpenCV实现答题卡自动打分!
    【LibTorch】C++中部署PyTorch模型(以DenseTNT模型为例)
    【C#进阶】C#语法中一些常用知识点总结
    行为型模式-观察者模式
    安装、测试和训练OpenPCDet:一篇详尽的指南
    基于SWAT-MODFLOW地表水与地下水耦合
    数据结构:顺序表
    JAVA计算机毕业设计在线专业培养方案系统Mybatis+源码+数据库+lw文档+系统+调试部署
    营造激发自驱力注重培养学习力的想法一
    利用labelme制作自己的coco数据集(labelme转coco数据集)
  • 原文地址:https://blog.csdn.net/weixin_43564241/article/details/126674733
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号