码农知识堂 - 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年最新《谷粒学院开发教程》:10 - 前台支付模块
    leetcode_2678 老人的数目
    Golang log包的源码分析
    【Linux】系统api和指令的模拟实现
    《Python3 网络爬虫开发实战》:便于高效检索的 Elasticsearch 存储
    00-开源离线同步工具DataX3.0重磅详解!
    UGeek大咖说 | 精彩回顾:京东商城可观测性体系的落地与实践
    监控易:支持多种协议和设备,适应复杂多变的IT环境
    html--心花怒放
    基于qlib自定义的A股股票池:计算均线,动量,MACD等以及可视化
  • 原文地址:https://blog.csdn.net/weixin_43972154/article/details/125440669
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号