• C/C++中的函数指针的写法


    C/C++里的函数指针功能属于重要但平时用的不多,语法又比较难记,值的记录、学习一下。

    写法一: 直接申明

    //该代码申明了一个函数指针fn_b,他对应的函数的参数类型为void*,返回值类型为void*
    void *(*fn_b)(void *);
    

    也支持在申明的时候同时赋值,如下:

    void *(*fn_b)(void *) = test_fn1;
    

    写法二:先通过typedef定义类型,在申明变量

    typedef void *(*fn_void_void)(void *);
    fn_void_void fn_a = fn1;
    

    这样写虽然多了一步,但可读性有了很大提高。

    而且如果要定义多个变量的话,也是能减少重复的代码,所以更建议第二种写法。

    其他类型的函数指针的定义示例

    //下面函数指针类型表示,函数的两个参数类型分别为void*和int,返回值为void*
    
    
    //写法1,直接申明
    void *(*fn_d)(void *, int) = test_fn2;
    
    //写法2,先typedef
    typedef void *(*fn_void_void_int)(void *, int);
    fn_void_void_int fn_c = test_fn2;
    

    示例代码

    #include <stdio.h>
    
    void *fn1(void *args)
    {
        char *tmp = (char *)(args);
        printf("%s is printing in %s\n", tmp, __func__);
        return (void *)0;
    }
    
    void *fn2(void *args, int i)
    {
        char *tmp = (char *)(args);
        printf("%s:%d is printing in %s\n", tmp, i, __func__);
        return (void *)0;
    }
    
    typedef void *(*fn_void_void)(void *);
    typedef void *(*fn_void_void_int)(void *, int);
    
    int main()
    {
        fn_void_void fn_a = fn1;
        void *(*fn_b)(void *) = fn1;
        // void *(*fn_b)(void *);
        // fn_b = fn1;
    
        fn_void_void_int fn_c = fn2;
        void *(*fn_d)(void *, int) = fn2;
    
        char *p_hello = (char *)"hello";
    
        fn_a(p_hello);
        fn_b(p_hello);
    
        fn_c(p_hello, 1);
        fn_d(p_hello, 2);
    
        return 0;
    }
  • 相关阅读:
    Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks
    Appium,安装WebDriverAgent(WDA)
    Charles界面介绍及使用方法
    手机通过Charles抓取https包
    jacoco统计server端功能测试覆盖率
    Android学习路-activity活动
    Android学习路-Android Studio的工程目录
    js实现多级复选框的交互
    python3使用paramiko操作远程机器
    ubuntu中查看各种设备和资源的命令汇总
  • 原文地址:https://www.cnblogs.com/joyer/p/16284554.html
Copyright © 2020-2023  润新知