请高手帮我分析一下这个参数各个部分的类型
这个参数出自于 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
小弟指针知识掌握的不多,请大虾把参数拆开来具体帮小弟分析一下。 展开
(总原则,声明顺序与调用顺序一致。)步骤:
先抹掉左边第一个类型(void*)这意味着右边一整坨东东的最终返回值/类型是任意类型指针,剩下:(*start_routine) (void *)
从变量名开始分拆(优先向左看):
start_routine
(向左看)紧挨start_routine的操作符是*,说明start_routine是一个指针变量。
(向左看)紧挨*start_routine的操作符是(),说明*start_routine指向某种符号(可以是数组名或者函数等等)而非某个储存空间。
(向左看)没有了,向右看,紧挨(*start_routine) 是一个(),意味着*start_routine指向一个函数首地址,换句话说(*start_routine) (XXXXXX),表示调用一个函数,函数的形式为XXX(XXXX);
再看这个()里的东西:void*,意味着函数的参数是任意类型指针即函数的形式为XXX(void* a);之类。
再向右看,没了。那么这个函数的返回值就是第一步所抹掉的类型:void*
那么start_routine是一个指针变量,其内容储存一个函数的入口地址。这个变量可以用来调用这个函数。(所谓的函数指针)函数原型如下:
void* F(void* a);//函数名F,形参名a都是可以任意的。
可以:start_routine=F;
那么(*start_routine)("sdf");与F("sdf");意思就是一样的,都是调用F函数。
void *(*start_routine) (void *)作为函数的参数,意味着你可以自定义一个类似于以上F函数一样形式的函数,作为回调,当线程被创建时由系统调用。这个时候,系统就可以去调用一个他并不知道的函数,这个函数由你来决定是什么,怎么运作,用来干什么。系统不必了解这些细节,只管调用就OK了。
2024-10-28 广告