函数指针

作者: 风情云 | 来源:发表于2020-03-18 18:18 被阅读0次

    函数指针

    函数指针就是指向函数的一个指针,函数名就是一个地址,定义一个指针指向函数体,此指针就是函数指针。

    定义与使用

    //定义一个函数
    void func(void)
    {
        printf("error\n");
    }
    int main()
    {
        //第一种方法
        typedef void F1(void);
        F1 *f1 = func;
        //第二种方法
        typedef void (*F2)(void);
        F2 f2 = func;
        //第三种方法 (常用)
        void (*f3)(void) = func;
        //使用函数指针,也称为仿函数
        f3();
        return 0;
    }
    

    函数指针的定义与数组指针有点类似,也都是有三种方法。要注意指向函数体的返回值与形参列表,两者要一致,如果实现带形参的指针类型指向不带形参的函数体,语法没有错,但是,运行可能出错。所以要返回类型与形参列表要一致。

    函数指针当作形参

    void func(int n)
    {
        printf("n = %d\n",n);
    }
    //函数指针当作形参
    void test(void (*f)(int),int n)
    {
        f(n);
    }
    int main()
    {
        void (*f)(int n) = func;
        test(f,4);
        return 0;
    }
    

    函数指针当作形参可以实现回调函数,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。该函数可以当作中间函数,中间函数自己并没有实现,而是调回其他函数来实现。


    回调函数

    函数跳转表

    #include <stdio.h>
    #include <stdlib.h>
    
    int add(int a,int b)
    {
        return a+b;
    }
    int subtract(int a,int b)
    {
        printf("%d\n",a-b);
        return a-b;
    }
    int multiply(int a,int b)
    {
        return a*b;
    }
    void table()
    {
        //定义函数跳转表
            //函数指针数组
        int (*func[3])(int,int) = {add,subtract,multiply};
        char ch[3] = {'+','-','*'};
        printf("请输入运算\n");
        int a,b;
        char c;
        scanf("%d%c%d",&a,&c,&b);
        int i;
        int num = sizeof(ch)/sizeof(ch[0]);
        for(i=0;i<num;i++)
        {
            if(c == ch[i])
            {
                //使用跳转表
                int l = func[i](a,b);
                printf("%d\n",l);
                break;
            }
        }
    }
    int main()
    {
        table();
        return 0;
    }
    
    
    函数跳转表

    使用函数跳转表可以不需要i多层f else语句判断,看起来很凌乱,维护起来也比较麻烦,增加函数只需在跳转表登记函数名就可以,看起来也比较舒服。


    微信号

    相关文章

      网友评论

        本文标题:函数指针

        本文链接:https://www.haomeiwen.com/subject/ftmcyhtx.html