void *(*routine)(void *) 在 C 中是啥意思? [复制]
Posted
技术标签:
【中文标题】void *(*routine)(void *) 在 C 中是啥意思? [复制]【英文标题】: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 【参考方案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 关于如何阅读声明的简洁明了的解释:)以上是关于void *(*routine)(void *) 在 C 中是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章