【问题标题】:define a pointer variable to the function in C program在 C 程序中定义一个指向函数的指针变量
【发布时间】:2016-01-21 19:58:40
【问题描述】:

如果我想定义一个指针变量p指向下面定义的函数foo(),那么p的确切类型应该是什么?

int *foo(void *arg)
{
    ...
}

【问题讨论】:

    标签: c pointers function-pointers


    【解决方案1】:

    应该是

    typedef int *(*funtion_foo_type)(void *);
    

    【讨论】:

    • 实际上,我建议为函数签名定义一个typedef,就像函数一样,但之前有typedef,例如typedef int*foo_type(void*); 然后使用指向该类型的指针,即foo_type* funptr; 更具可读性
    • 然而,这不是一个类型。这是一个类型定义运算符。
    • @KyryloPolezhaiev:typedef 不是操作员。从语法上讲,它是一个存储类说明符typedefed 名称是实际类型的别名。
    • 对不起,我的意思是声明。我不是指typedef,我指的是整个字符串。试图避免混淆,制造更多的混淆(:
    【解决方案2】:

    您需要将指针作为指向函数的指针,返回 int *,接受 void* 参数。你可以让它像

    int * (*p) (void *);
    

    然后,你可以使用

    p = foo;
    

    【讨论】:

      【解决方案3】:

      记住Kyrylo Polezhaiev的评论,p的类型

      int*(*)(void*)
      

      要声明p,您需要在类型中的正确位置插入名称:

      int*(*p)(void*);
      

      但使用别名通常更易读:

      typedef int*(func_t)(void*);
      func_t* p;
      

      【讨论】:

        【解决方案4】:

        为了让函数声明更容易

        int *foo(void *arg);
        

        定义一个别名,例如Tfoo,它看起来与函数声明本身的方式相同

        typedef int *Tfoo(void *);
        

        之后声明一个指向函数的函数指针就很容易了。随便写

        Tfoo *foo_ptr = foo;
        

        否则你可以写

        typedef int * (* TFoo_ptr )(void *);
        
        Tfoo_ptr foo_ptr = foo;
        

        或者你可以直接编写函数指针的声明而不使用 typedef/

        int * (* foo_ptr )(void *) = foo;
        

        【讨论】:

          【解决方案5】:

          你说的是指向函数的指针吗?

          首先定义一个指向函数的指针,该函数接受void 参数并返回int

          typedef   int (*Ptrtofun)(void); 
          

          现在可以安全地将其指向您的函数。

          Ptrtofun p;
          p = &foo(void);
          

          现在你有一个 ptr p 可以运行并且可以轻松使用它..

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-17
            • 1970-01-01
            • 1970-01-01
            • 2016-01-17
            • 2020-10-13
            • 2012-01-25
            相关资源
            最近更新 更多