C 如何正确使用函数指针

C 如何正确使用函数指针,c,function-pointers,typedef,C,Function Pointers,Typedef,我对函数指针有问题。我有这个类型: typedef struct patchwork *(*create_patchwork_value_fct) (const enum nature_primitif); 这是通用的(在另一个文件中实现)。我想用输入调用它。我该怎么办?你需要 定义typedefed函数指针类型的变量 将具有相同签名的函数的地址放入其中 使用变量作为普通函数名进行函数调用 伪码 如果你有

我对函数指针有问题。我有这个类型:

typedef struct patchwork *(*create_patchwork_value_fct) 
                                            (const enum nature_primitif);
这是通用的(在另一个文件中实现)。我想用输入调用它。我该怎么办?

你需要

  • 定义
    typedef
    ed函数指针类型的变量
  • 将具有相同签名的函数的地址放入其中
  • 使用变量作为普通函数名进行函数调用
  • 伪码

    如果你有这样一个函数

    struct patchwork * funccall(const enum nature_primitif)
    {
      //do something
    }
    
    然后,你就可以

    create_patchwork_value_fct fp= funccall;
    struct patchwork * retptr = NULL;
    enum nature_primitif enumVal = <some enum value>;
    
    retptr = fp(enumVal);
    
    create\u patchwork\u value\u fct fp=funccall;
    结构修补*retptr=NULL;
    enum nature_primitif enumVal=;
    retptr=fp(枚举值);
    

    也许您可以阅读以获得更多信息。

    这实际上不是函数指针-这是定义函数指针类型:

    typedef结构补丁*(*创建补丁\u值\u fct)
    (const enum nature_primitif)

    因此,这定义了一个名为
    create\u patchwork\u value\u fct
    的函数指针类型。这是一个函数指针,指向采用单个参数(const enum nature_primitif)的函数,并返回一个
    struct patchwork*
    ——即指向修补结构的指针

    让我们看看如何使用它:

    void someFunc(create_patchwork_value_fct funcToCall, enum param)
    {
        funcToCall(param);
    }
    
    struct patchwork* CreateAPatchworkValue(enum nature_primitif enumVal)
    {
         struct patchwork* pwork = malloc(sizeof(struct patchwork));
         pwork->someVal = enumVal;
         return pwork;
    }
    
    
    void main()
    {
        someFunc(CreateAPatchworkValue, <a valid nature_primitif enumeration value>)
    }
    
    void someFunc(创建\u补丁\u值\u fct函数调用,枚举参数)
    {
    函数调用(param);
    }
    结构修补*CreateAPatchworkValue(枚举性质\u原始枚举值)
    {
    结构修补*pwork=malloc(sizeof(结构修补));
    pwork->someVal=枚举值;
    返回工作;
    }
    void main()
    {
    someFunc(CreateAPatchworkValue,)
    }
    
    在本例中,
    main()
    调用
    someFunc()
    ,将createApachWorkValue指针作为
    funcToCall
    参数传递给它,并从nature\u primitif枚举传递一个值


    someFunc然后调用funcToCall,这实际上是对CreateAPatchworkValue的调用。

    我缺少什么吗?难道不是创建一个类型定义,而不是函数本身吗?@DaanTimmer是的,我是正确的。不过多亏了mjs.:-)此函数指针typedef的工作原理与执行
    typedef int*undersome\u t;时完全相同。。。晦涩的\u t ptr=&some\u int