void *(*例程)(void *)在C中的含义是什么?

时间:2014-01-28 16:22:04

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

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

void *(*routine)(void *)

我觉得很困惑。也许它是指针......指针......指针?

如果我想将这个东西传递给一个函数,我们将如何操纵它?我试图将这个例程构造作为一个参数传递给一个带void(*)(void)的函数......但我真的很遗憾的是它实际意味着什么。

2 个答案:

答案 0 :(得分:23)

从最左边的标识符开始,逐步解决问题,记住在[]之前没有明确的括号分组()和函数调用*,所以

  • *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 :(得分:13)

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;
}