• 函数指针与回调函数


    (1) 

    1分钟学会函数指针与回调函数(上)_哔哩哔哩_bilibili

    1. #include
    2. #include
    3. int sum(int x,int y){
    4. return x+y;
    5. }
    6. int difference(int x,int y){
    7. return x-y;
    8. }
    9. int product(int x,int y){
    10. return x*y;
    11. }
    12. int main(int argc, char *argv[])
    13. {
    14. QCoreApplication app(argc, argv);
    15. int a=5;
    16. int b=8;
    17. int (*p_func)(int,int);
    18. p_func=sum;
    19. printf("sum's address=%p\n",sum);
    20. printf("func_ptr=%p\n",p_func);
    21. printf("%d+%d=%d\n",a,b,sum(a,b));
    22. printf("%d+%d=%d\n",a,b,p_func(a,b));
    23. return app.exec();
    24. }
    1. sum's address=00401659
    2. func_ptr=00401659
    3. 5+8=13
    4. 5+8=13

    关键:

    int (*p_func)(int,int);

    函数指针func_ptr指向的地址为00401659

    函数名的首地址是00401659

    函数名可以被看作一个常量,它保存了函数的内存地址

    函数的内存地址,存储了函数开始执行的位置

    (2) 

    C语言 | 函数指针作为函数的参数_函数指针作为参数_嵌入式大杂烩的博客-CSDN博客

    1. #include
    2. #include
    3. typedef int (*fun_t)(int,int);
    4. int calculate(int a,int b,fun_t operation)
    5. {
    6. int result;
    7. result=operation(a,b);
    8. return result;
    9. }
    10. int add2(int a,int b)
    11. {
    12. return a+b;
    13. }
    14. int main(int argc, char *argv[])
    15. {
    16. QCoreApplication app(argc, argv);
    17. int result;
    18. int a=192,b=48;
    19. result=calculate(a,b,add2);
    20. printf("%d+%d=%d\n",a,b,result);
    21. return app.exec();
    22. }

    关键:

    typedef int (*fun_t)(int, int);

    fun_t指向一个带两个int类型的形参int类型的返回值的函数。

    使用关键字typedef int(*)(int,int)进行重命名为fun_t。

    我们已经很熟悉int,float,double这些类型了。

    如int a=10;

    这里就是新定义了一种类型fun_t。

    可以有fun_t  m=xxx;

    1. int xxx(int,int)
    2. {
    3. ......
    4. return value;
    5. }

    函数指针可以作为参数传递给另一个函数。

    这时函数指针的使用就像普通的常量和变量

    函数指针作为参数传递的时候,接收参数传递的函数

    通常需要根据指针调用对应的函数

    (3)

    函数指针做函数参数 使用总结及其意义_函数指针作为函数的参数_AI浩的博客-CSDN博客

    函数名是函数体的入口地址

    (1)可通过函数类型定义函数指针:FuncType* pointer;

    (2)可直接定义:type (*pointer)(parameter list);

    pointer:函数指针变量名

    type:函数的返回值类型

    parameter list:指向函数的参数列表。

    1. #include
    2. #include
    3. using namespace std;
    4. int add(int a,int b)
    5. {
    6. return a+b;
    7. }
    8. int main(int argc, char *argv[])
    9. {
    10. QCoreApplication app(argc, argv);
    11. int sum=add(1,2);
    12. cout<<"sum:"<
    13. //声明一个函数类型
    14. {
    15. typedef int(MyFuncType)(int a,int b);
    16. //这里函数类型名为MyFuncType
    17. //int xxx(int,int);
    18. MyFuncType * myFuncVar=NULL;
    19. myFuncVar=add;
    20. int sum1=myFuncVar(2,4);
    21. cout<<"sum1:"<
    22. }
    23. //声明一个函数指针类型。
    24. {
    25. typedef int(*PFuncType)(int a,int b);
    26. PFuncType myFunc=NULL;
    27. //为什么这里又取地址呢?
    28. myFunc=&add;
    29. int sum2=myFunc(3,5);
    30. cout<<"sum2:"<
    31. }
    32. //定义一个函数指针,指向一个函数的入口地址
    33. {
    34. int(*MYPFUNC)(int a,int b);
    35. MYPFUNC =add;
    36. int sum3=MYPFUNC(10,5);
    37. cout<<"sum3:"<
    38. }
    39. return app.exec();
    40. }

    sum:3
    sum1:6
    sum2:8
    sum3:15

     思考:

    myFunc=&add;

    这里为什么要取地址?

    1. {
    2. typedef int(*PFuncType)(int a,int b);
    3. PFuncType myFunc=NULL;
    4. myFunc=&add;
    5. int sum2=myFunc(3,5);
    6. cout<<"sum2:"<
    7. }
    8. {
    9. typedef int(*PFuncType)(int a,int b);
    10. PFuncType myFunc=NULL;
    11. myFunc=add;
    12. int sum2=myFunc(3,5);
    13. cout<<"sum2:"<
    14. }

    结果一致,这两者有什么区别?

    函数指针做函数参数:

    函数指针A指向函数C

    函数指针A作为函数参数,传递给一个被调用函数B,被调用函数

    就可通过该指针调用外部函数C,这就形成了回调。

  • 相关阅读:
    几款常用database的性能对比
    541.反转字符串
    vue跨域proxy详解(下)
    美容院如何体现差异化服务?
    Ubuntu的EFI分区无法删除
    node.js基础学习
    DDD领域驱动中的支撑域、通用域、核心域
    Redis实战案例及问题分析之-附近商铺(GEO数据结构)-用户签到(BitMap)-UV统计(HyperLogLog)
    从零开始使用 Astro 的实用指南
    【论文阅读笔记】XLINK:淘宝短视频传输的多径QUIC协议
  • 原文地址:https://blog.csdn.net/weixin_51883798/article/details/132890801