zoukankan      html  css  js  c++  java
  • 指针函数 函数指针 回调函数

    指针函数

    指针函数本质是一个函数,只不过返回值为某一类型的指针(地址值)。

    函数返回值必须用同类型的变量来接受,也就是说,指针函数的返回值必须赋值给同类型的指针变量。

    指针函数的定义格式:类型名 *函数名(函数参数列表);

    /* !< 指针函数 */
    #include <stdio.h>
    
    int *sum(int a, int b);
    
    int main() {
        int a = 1;
        int b = 2;
        int *p = NULL;
    
        p = sum(a, b);
        printf("%d
    ", *p);
        return 0;
    }
    
    int *sum(int a, int b) {
        static int sum = 0;
        sum = a + b;
        return &sum;
    }
    

    函数指针

    函数指针本质是一个指针,只不过这个指针指向一个函数。

    常见的函数都有其入口,比如main()函数是整个程序的入口,我们调用的其他函数都有其特定的入口,正如我们可以通过地址找到相应的变量一样,我们也可以通过地址找到相应的函数。而这个存储着函数地址的指针就是函数指针。

    换言之,我们所说的指针变量通畅指向一个整形、字符型、或者数组等变量,而函数指针指向的是函数。

    正如我们可以通过指针访问相应的变量,函数指针也可以像函数一样用于调用函数、传递参数。

    可以通过函数类型定义函数指针:functype pointer

    也可以直接定义:type (*pointer) (parameter list)

    函数指针定义格式:类型名 (*函数名)(函数参数列表)

    我们可以发现,这里的"*函数名"是用括号括起来的

    函数指针有两个用途:调用函数和做函数的参数.

    /* !< 函数指针 */
    #include <stdio.h>
    
    int max(int x, int y)
    {
        return x > y ? x : y;
    }
    
    int main(void)
    {
        /* !< p is function pointer */
        int (* p)(int, int) = &max; //& 可以省略
        int a, b, c, d;
        printf("plesae input three number
    ");
        scanf("%d %d %d", &a, &b, &c);
        /* !<equal direct call function, d = max(max(a, b), c) */
        d = p(p(a, b), c);
        printf("largest number is: %d
    ", d);
        return 0;
    }   
    

    回调函数

    函数指针作为某个函数的参数

    我们知道,函数指针变量也是一个变量,那么作为变量当然也可以当做参数来使用。

    为了理解回调函数,我们先要搞清楚回调函数有什么作用。比如老板、经理、你三个角色。老板通常是规则的指定着,经理按照规则指派相应的人去做事,而你就是任务的具体执行者。

    当老板要求经理去做一个事情,那么老板就是主调函数,经理就是回调函数,你按照规则去处理事情就是相应回调函数。你处理的结果会反馈给经理,经理拿着你的结果再反馈给老板。老板就可以使用这个结果去做相关的事情了。

    在这个环节中,你只需要按照指定的规则去做事,而经理不需要考虑事情是怎么做的,他只需要把相应的事情分配给对应的人去处理即可,然后将获取的结果反馈给老板。如果规则有变,只需要对应的员工知道哪里改变了,而经理不需要关注这些细节。

    以上就是回调函数

    回调函数是利用函数指针实现的一种调用机制,其调用机制原理如下:

    • 调用者不知道具体事件发生时候需要调用的具体函数

    • 被调用函数不知道何时被调用,只知道被调用会完成需要的任务。

    • 当具体事件发生时,调用者通过函数指针调用具体函数

    回调机制将调用者和被调函数分开,两者互补依赖。

    /* !< 回调函数 */
    #include <stdio.h>
    
    int add_ret();
    
    int add(int a, int b, int (*add_value)())
    {
        return (*add_value)(a, b);
    }
    
    int main(void)
    {
        int sum = add(3, 4, add_ret);
        printf("sum: %d
    ", sum);
        return 0;
    }
    
    int add_ret(int a, int b)
    {
        return a + b;
    }
    
  • 相关阅读:
    1036 商务旅行
    4165 ​高精度求阶乘
    3117 高精度练习之乘法
    封装代理
    freemarker写select组件(三)
    VC双缓冲画图技术介绍
    JS学习十七天----工厂方法模式
    Struts2 全局结果集
    HDU 1730 Northcott Game
    C++ STL:vector
  • 原文地址:https://www.cnblogs.com/xzpin/p/11762916.html
Copyright © 2011-2022 走看看