我正在学习C,我来到这个表达式:
void *(*routine)(void *)
我觉得很困惑。也许它是指针......指针......指针?
如果我想将这个东西传递给一个函数,我们将如何操纵它?我试图将这个例程构造作为一个参数传递给一个带void(*)(void)
的函数......但我真的很遗憾的是它实际意味着什么。
答案 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;
}