• C++ :函数: 函数指针


    1: 什么是函数指针

    1. 这个问题老生常谈了,不用理解的多么复杂,它其实就是一个特殊的指针,它用于指向函数被加载到的内存首地址,可用于实现函数调用。
    2. 听上有点像函数名,函数名也是记录了函数在内存中的首地址,加()就可以调用。
    3. 不错,不过函数指针和函数名还是有点区别的,他们虽然都指向了函数在内存的入口地址,但函数指针本身是个指针变量,对他做&取地址的话会拿到这个变量本身的地址去
    4. 而对函数名做&取址,得到的还是函数的入口地址。如果是类成员函数指针,差别更加明显。

    始终记住最大的两个不同点

    • 既然他是指针,而且不是const的,那么他就是灵活可变的,通过赋值不同的函数来实现不同的函数调用。
    • 然而他也有自己的限制(函数签名——返回值类型和参数类型),那不是和覆盖、多态实现的功能一样了么?额。。。要这么理解也行,但不全对

    总结

    上面说到函数指针的功能类似覆盖或多态,覆盖和多态更多体现的是对象自身的特征和对象之间的继承关联,而函数指针则没这么多讲究,他就是灵活。

    函数指针不需要依附于对象存在,他可以用来解决基于条件的多个函数筛选,也可以处理完全无关的几个函数。

    所以他的作用,什么封装性好、用于回调函数、实现多态等等,随便了,只有一条,符合他的函数签名并且可达。

    1: 简单的函数指针:void (*f_ptr)() 

    这是定义了一个名为f_ptr的函数指针「变量」
        给函数指针赋值:f_ptr = function;

    function是一个已经定义的函数名(给函数指针赋值的时候,对应的函数签名(返回值和参数列表)必须是和他的相匹配的。)

    1. using namespace std;
    2. double cal_m1(int lines)
    3. {
    4. return 0.05 * lines;
    5. }
    6. double cal_m2(int lines)
    7. {
    8. return 0.5 * lines;
    9. }
    10. void estimate(int line_num, double (*pf)(int lines))
    11. {
    12. cout << "The " << line_num << " need time is: " << (*pf)(line_num) << endl;
    13. }
    14. int main()
    15. {
    16. int line_num = 10;
    17. // 函数名就是指针,直接传入函数名
    18. estimate(line_num, cal_m1);
    19. estimate(line_num, cal_m2);
    20. return 0;
    21. }
    22. // 打印结果
    23. The 10 need time is: 0.5
    24. The 10 need time is: 5

    2:typedef void (*f_ptr)()

    这是定义了一个名为f_ptr的函数指针「类型」,这个类型代表返回值为空,参数为空的函数指针类型

    声明一个函数指针并赋值 :

    typedef void (*f_ptr)();

    f_ptr fp = function ; // void (*f_ptr)() = function;

    1. using namespace std;
    2. // 类型定义:声明函数指针
    3. typedef int(*pfunc)(int x, int y);
    4. int main()
    5. {
    6. auto func = [](int x, int y)->int {
    7. return x + y;
    8. };
    9. pfunc p1 = nullptr; // pfunc 定义函数指针
    10. p1 = func; //lambda表达式向函数指针转换
    11. std::cout << p1(1, 2) << std::endl;
    12. return 0;
    13. }
    14. // 打印值: 3

    参考文献:

    万字长文系统梳理一下C++函数指针 - 知乎

    C++ 函数指针取地址与取值 - 九鼎煮鸡蛋 - 博客园

  • 相关阅读:
    车船边缘网关是如何给车辆船只定位的?
    小解C语言文件编译过程【linux】
    Python:实现quantum entanglement量子纠缠技术算法(附完整源码)
    npm install的--save和--save-dev使用说明
    Arduino驱动ML8511紫外线传感器(光照传感器篇)
    来自给大一新生的分享会——如何更好的学习专业知识
    【Linux】了解文件的inode元信息,以及日志分析
    electron安装失败时配置
    websocket实现实时变化图表内容
    yocto meta-st-stm32mp conf文件夹分析
  • 原文地址:https://blog.csdn.net/u013620306/article/details/127892382