美文网首页
C语言之函数指针

C语言之函数指针

作者: hysea | 来源:发表于2020-08-13 09:26 被阅读0次

    函数指针的定义

    一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,与数组名类似。

    我们可以将这个函数的首地址赋值给一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

    函数指针的定义形式
    // returnType:函数返回值类型
    // pointerName:指针名称
    // param list:函数的参数列表。参数可以同时指定类型和名称,也可以只指定类型,省略名称。跟函数声明类似
    returnType(*pointerName)(param list);
    

    函数指针的基本使用

    // 定义基本函数
    void message() {}
    // 定义函数指针并初始化
    void(*func_p)() = &message;
    // 调用函数指针,与message()调用等价
    func_p(); 
    
    函数指针的应用实例

    实例1:将函数指针作为形参来接受外部函数

    #include <stdio.h>
    
    int add(int num1, int num2) {
        return num1 + num2;
    }
    
    int minus(int num1, int num2) {
        return num1 - num2;
    }
    
    // 将函数指针直接定义到函数形参中,类似java中的多态
    // 可以将函数指针作为函数参数传入
    void showMsg(int(*c)(int, int), int a, int b) {
        int r = c(a, b);
        printf("calculate result: %d\n", r);
    }
    
    int main() {
        showMsg(add, 10, 10); // 20
        showMsg(minus, 30, 2); // 28
    
        return 0;
    }
    

    实例2:利用函数指针实现回调函数

    #include <stdio.h>
    
    //模拟网络请求回调
    void requestNet(char *url, void(*callBack)(char *)) {
        printf("request url: %s, request...\n", url);
        //模拟网络请求耗时
        char *str = "response data: hello world!";
        callBack(str);
    }
    
    //回调函数
    void netCallBack(char *str) {
        printf("net request callBack\n");
        printf("callBack data: %s\n", str);
    }
    
    int main(void) {
        char *url = "www.baidu.com";
        requestNet(url, netCallBack);
    
        return 0;
    }
    
    // 打印结果:
    // request url: www.baidu.com, request...
    // net request callBack
    // callBack data: response data: hello world!
    

    相关文章

      网友评论

          本文标题:C语言之函数指针

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