码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++基础】函数指针


    【C++基础】函数指针

    • 函数指针是什么?
    • 声明函数指针
    • 使用函数指针
      • 让指针指向函数的方法
      • 使用函数指针调用函数的方法
    • 函数指针作为形参
    • 返回的指针再指向函数

    函数指针是什么?

    顾名思义,函数指针是一个指向函数的指针。官方(《C++prime》)的定义如下:

    函数指针指向的是函数,而非对象,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

    声明函数指针

    如下有一个普通函数:

    bool lengthCompare(const string &s1,const string &s2);
    
    • 1

    如果想声明 可以 指向该函数的指针的话,则用指针名如 (*p) 替换函数名 lengthCompare 即可,如:

    bool (*p)(const string &,const string &); // 注意,*p两端的括号必不可少
    
    • 1

    如上,p就是一个指向某个(并非一定要指向上面的普通函数,但是它可以指向上面的普通函数)函数的指针,这些函数的返回类型和形参列表都要被限制在函数指针指定的模式下,即函数需要传入两个引用类型的参数,返回的是一个bool类型的值。

    使用函数指针

    让指针指向函数的方法

    上面声明了一个函数指针,接下来我们使用如下几种方法使得函数指针指向一个特定的函数:

    p = lengthCompare; // lengthCompare是上面声明普通函数时的函数名
    p = &lengthCompare; // 与上面方法等价
    
    • 1
    • 2

    如果函数指针指向的函数的返回类型、形参类型有一个不同,都会产生错误;函数指针指向某个函数是一种精准匹配。
    此外,函数指针可以指向0或者nullptr,此时表示该函数指针没有指向任何函数。

    使用函数指针调用函数的方法

    bool b1 = pf("hello","world"); // 使用函数指针调用函数
    bool b2 = (*pf)("hello","world"); // 与第一种方法等价
    bool b3 = lengthCompare("hello","world"); // 与第一种方法等价
    
    • 1
    • 2
    • 3

    函数指针作为形参

    形参可以是指向函数的指针,如:

     // 第三个形参是一个函数类型,它会自动转换成函数指针
    void useBigger(const string &s1,const string &s2,bool pf(const string & ,const string & ));
    // 与上述声明等价,第三个形参是一个函数指针
    void useBigger(const string &s1,const string &s2,bool (*pf)(const string &,const string &))
    
    • 1
    • 2
    • 3
    • 4

    此外,函数可以直接作为 实参 使用:

    // 此时第三个函数名会自动转换成函数指针
    useBigger(s1,s2,lengthCompare);
    
    • 1
    • 2

    返回的指针再指向函数

    int (*f1(int))(int*, int);
    
    • 1

    我们从内向外进行分析:

    *f1(int)
    
    • 1

    上面的f1右侧含有形参列表,代表f1是一个函数,f1前面有 *,然后:

    (*f1(int))(int*, int);
    
    • 1

    我们将 *f1(int) 当做一个整体,左侧是 (*p)(形参列表) 的形式,代表其是一个指向函数的指针,最后:

    int (*f1(int))(int*, int);
    
    • 1

    返回类型是int,表示这个函数需要返回int类型。

  • 相关阅读:
    2022甘肃二级造价工程师考试报名开始!北京、浙江二造考试恢复!
    【设计模式】Java设计模式 - 模板模式
    OSPF高级特性 —— LSA-3过滤 + Distribute-list过滤
    CSDN21天学习挑战赛之选择排序
    做交互设计都有哪些需要掌握的思维方式
    围堵或改 “倾销”?芯片价格战要来了?
    LVS+NAT 负载均衡群集,NAT模式部署
    使用html+css实现一个静态页面(厦门旅游网站制作6个页面) 旅游网页设计制作 HTML5期末考核大作业,网站——美丽家乡。 学生旅行 游玩 主题住宿网页
    [构造]Complementary XOR Codeforces1750C
    【Linux】权限管理
  • 原文地址:https://blog.csdn.net/weixin_43972154/article/details/125440669
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号