• 函数与指针分析


    函数类型

    • C语言中的函数有自己特定的类型
    • 函数的类型由返回值,参数类型和参数个数共同决定
      • int add(int i, int j)的类型为int(int, int)
    • C语言中通过typedef为函数类型里命名
      • typedef type name(parameter list)

    例:
    typedef int f(int, int);
    typedef void p(int);

    函数指针

    • 函数指针用于指向—个函数
    • 函数名是执行函数体的入口地址
    • 可通过函数类型定义函数指针: FuncType* pointer;
    • 也可以直接定义: type (*pointer)(parameter list);
      • pointer为函数指针变量名
      • type为所指函数的返回值类型
      • parameter list为所指函数的参数类型列表

    面试小问题

    如何使用C语言直接跳转到某个固定的地址开始执行?

    例子1:函数指针的使用

    #include <stdio.h>  
      
    typedef int(FUNC)(int);  
      
    int test(int i)  
    {  
        return i * i;  
    }  
      
    void f()  
    {  
        printf("Call f()...
    ");  
    }  
      
    int main()  
    {  
        FUNC* pt = test;  
        void(*pf)() = &f;  
          
        printf("pf = %p
    ", pf);  
        printf("f = %p
    ", f);  
        printf("&f = %p
    ", &f);  
          
        pf();  
          
        (*pf)();  
          
        printf("Function pointer call: %d
    ", pt(2));  
          
        return 0;  
    }  
    

    5、回调函数

    • 回调函数是利用函数指针实现的一种调用机制
    • 回调机制原理
      • 调用者不知道具体事件发生时需要调用的具体函数
      • 被调函数不知道何时被调用,只知道需要完成的任务
      • 当具体事件发生时,调用者通过函数指针调用具体函数
      • 回调机制中的调用者和被调函数互不依赖

    例子2:回调函数使用示例

    #include <stdio.h>  
      
    typedef int(*Weapon)(int);  
      
    void fight(Weapon wp, int arg)  
    {  
        int result = 0;  
          
        printf("Fight boss!
    ");  
          
        result = wp(arg);  
          
        printf("Boss loss: %d
    ", result);  
    }  
      
    int knife(int n)  
    {  
        int ret = 0;  
        int i = 0;  
          
        for(i=0; i<n; i++)  
        {  
            printf("Knife attack: %d
    ", 1);  
            ret++;  
        }  
          
        return ret;  
    }  
      
    int sword(int n)  
    {  
        int ret = 0;  
        int i = 0;  
          
        for(i=0; i<n; i++)  
        {  
            printf("Sword attack: %d
    ", 5);  
            ret += 5;  
        }  
          
        return ret;  
    }  
      
    int gun(int n)  
    {  
        int ret = 0;  
        int i = 0;  
          
        for(i=0; i<n; i++)  
        {  
            printf("Gun attack: %d
    ", 10);  
            ret += 10;  
        }  
          
        return ret;  
    }  
      
    int main()  
    {  
        fight(knife, 3);  
        fight(sword, 4);  
        fight(gun, 5);  
          
        return 0;  
    }  
    

    小结

    • C语言中的函数都有特定的类型
    • 可以使用函数类型定义函数指针
    • 函数指针是实现回调机制的关键技术
    • 通过函数指针可以在C程序中实现固定地址跳转
  • 相关阅读:
    【bzoj4240】有趣的家庭菜园
    「洛谷 P1801」黑匣子
    「SDOI 2009」Elaxia的路线
    NOIP 2016【蚯蚓】
    NOIP 2014【斗地主】
    尺取法
    POJ 3169 Layout
    51nod【1196】字符串的数量
    51nod1671【货物运输】
    hihocoder1075【开锁魔法】
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9213225.html
Copyright © 2020-2023  润新知