【问题标题】:What does void *(*routine)(void *) mean in C? [duplicate]void *(*routine)(void *) 在 C 中是什么意思? [复制]
【发布时间】:2014-02-20 01:51:24
【问题描述】:

我正在学习C,我来到了这个表达:

void *(*routine)(void *)

我觉得这很混乱。也许它是一个指针……指向一个指针……指向一个指针?

如果我想将这个东西传递给一个函数,我们将如何操作它?我正在尝试将此例程构造作为参数传递给采用 void(*)(void)... 的函数,但我对这实际上意味着什么感到迷茫。

【问题讨论】:

  • 在这种情况下,http://cdecl.org/ 是你的朋友。
  • cdecl.ridiculousfish.com/?q=void+*%28*routine%29%28void+*%29
  • 哇,感谢您的 cdecl!
  • 请注意,cdecl 最初是一个命令行工具,它在很多地方都可用。您不必通过网站来使用 cdecl。
  • @PinkElephantsOnParade - 只是让你知道,以防万一我想提到这个特定的签名被用作 pthread_create API 的一部分:man7.org/linux/man-pages/man3/pthread_create.3.html

标签: c pointers syntax function-pointers argument-passing


【解决方案1】:
void *(*routine)(void *);

声明一个指向函数的指针,该函数接受void *类型的参数并返回void *类型的指针


简单示例:

#include <stdio.h>

void* foo(void* x) {
    printf("Hello.");
}

int main(void) {
    void *(*routine)(void *);
    routine = foo;              // assings foo to our function pointer
    (*routine)(NULL);           // invokes foo using this pointer
    return 0;
}

输出:Hello.


“如果我想把这个东西传递给一个函数” ~ 这里是例子 2:

#include <stdio.h>

void* foo(void* x) {
    printf("Hello.");
}

typedef void *(*RoutinePtr)(void *);           // alias to make your life easier

void routineInvoker(RoutinePtr routine) {
    (*routine)(NULL); // invokes the routine
}

int main(void) {
    RoutinePtr routine = foo;   // creates a function pointer
    routineInvoker(routine);    // and passes it to our invoker
    return 0;
}

【讨论】:

    【解决方案2】:

    从最左边的标识符开始,然后继续前进,记住缺少带括号的显式分组,[] 和函数调用 () 绑定在 * 之前,所以

    • *a[N] 是一个 N 元素的指针数组
    • (*a)[N] 是一个指向 N 元素数组的指针
    • *f() 是一个返回指针的函数
    • (*f)() 是指向函数的指针

    所以,

            routine             -- routine
           *routine             -- is a pointer
          (*routine)(      )    -- to a function
          (*routine)(void *)    -- taking a single parameter of type void *
         *(*routine)(void *)    -- returning a pointer
    void *(*routine)(void *)    -- to void
    

    【讨论】:

    • +1 关于如何阅读声明的简洁明了的解释:)
    猜你喜欢
    • 2012-03-11
    • 2018-05-05
    • 2019-12-08
    • 1970-01-01
    • 2017-02-27
    • 2011-11-19
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多