zoukankan      html  css  js  c++  java
  • C++-函数与指针的关系(回调函数)

    1、函数类型 

      C语言中的函数有自己特定的类型 

      函数的类型由返回值参数类型参数个数共同决定 

                      ★ int add(int i, int j)的类型为int(int, int) 

      C语言中通过typedef为函数类型重命名 

                      ★ typedef type name(parameter list)  //name就是重命名的名字

    例: 

    typedef int f(int,  int);  //重命名为f
    typedef void p(int);       //重命名为p
    

    2、函数指针

      函数指针用于指向—个函数 

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

      可通过函数类型定义函数指针: FuncType* pointer; //FuncType是重命名的函数名

      也可以直接定义: type (*pointer)(parameter list);    //定义函数指针

                    - pointer为函数指针变量名 

                    - type为所指函数的返回值类型 

                    - parameter list为所指函数的参数类型列表 
      为何要定义函数指针呢?直接用函数名不就行了吗?

    面试小问题:

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

      我们只知道goto语句可以跳转到某个固定地址,但goto我们肯定是不能用的,那么我们就只能使用函数指针来使用了。

      

    #include <stdio.h>  
      
    typedef int(FUNC)(int);  //重命名 int (int) 类型
      
    int test(int i)       //
    {  
        return i * i;  
    }  
      
    void f()  
    {  
        printf("Call f()...
    ");  
    }  
      
    int main()  
    {  
        FUNC* pt = test;  //函数指针pt,用test初始化
        void(*pf)() = &f;  //pf也是函数指针,没有通过typedef,函数取不取地址是一样的,与数组不一样
          
        printf("pf = %p
    ", pf);  //三个都一样
        printf("f = %p
    ", f);  
        printf("&f = %p
    ", &f);  
          
        pf();  
          
        (*pf)();  //对应老式的写法等价于 f(),支持
          
        printf("Function pointer call: %d
    ", pt(2));  //4
          
        return 0;  
    }  
    

    5、回调函数 

      回调函数是利用函数指针实现的一种调用机制 

      回调机制原理 

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

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

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

      回调机制中的调用者和被调函数互不依赖 
      

    #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;  
    }  
    

    7、小结

      C语言中的函数都有特定的类型

      可以使用函数类型定义函数指针

      函数指针是实现回调机制的关键技术

      通过函数指针可以在C程序中实现固定地址跳转

  • 相关阅读:
    Android Sqlite 增删改查
    Android SQLiteOpenHelper Sqlite数据库升级onUpgrade
    Android SQLiteOpenHelper Sqlite数据库的创建与打开
    Android Xml,PullParser,解析
    Android Xml文件生成,Xml数据格式写入
    Android Studio生成get,set,tostring,构造方法
    Android SharedPreference
    Android 文件模式
    Android 权限的由来
    C++ essentials 之 union
  • 原文地址:https://www.cnblogs.com/lemaden/p/10194685.html
Copyright © 2011-2022 走看看