void*(*)(void*)何解?

如题所述

参数void*(*)(void*)是一个函数指针,前面的void为返回值类型,后面的void*为参数类型。

指向函数的指针变量的一般定义形式为:数据类型(*指针变量名)(函数参数列表)

函数名是可以缺省的,作为参数传递的时候会去调和void*(*)(void*)这个类型相匹配的函数的。

例如:

int func(int x); /* 声明一个函数 */

int (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

扩展资料:

“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-20
楼上第一次回答明显是错误 并误导人的,这表明楼上理解的并不深刻。 所以才会造成你的追问。并且继续误导后面看这个帖子的人。本着对民族的责任我特此订正如下:

首先这并不是一个具体的函数指针,(因为没有指针名字) 而是一个抽象出来的函数指针的模型 ,用来为专门应对这一类事物的复杂交互提供便利, 比如有了类型就能声“名”出未初始化的对象用来做参数甚至为该类事物提供动态分配的没名字的对象 , 以及批量操作对象。

(这样通过new \ delete产生这样的数据 就能达到灵活控制堆空间 在通过为多个函数实例提供共享引用该外部数据的功能的基础上 在函数不再用它的时候即时delete掉, 既减少了栈的消耗也实现了程序运行期对堆空间使用的收缩控制)。

函数指针类型的定义我就不再重复楼上已经解释过的,我提一些他疏漏的。
格式:
函数返回值数据类型 (*指针变量名)(函数的实际参数或者函数参数的类型)

上面是解答你问题的基础但是还不够 还要加上自定义类型typedef 的知识;
你尝试如下自定义函数指针类型 就明白其用法了:
\\kkk为自定义类型的名字

typedef void* (*kkk)(void* ,char*);

kkk p 就等于 void* (*p)(void* ,char*);\\ p才是该类型 实例的名字
详见:
”h——ttp://blog.163.com/dahai_boy/blog/static/32550066201102143228870/“

另外:
通过学习了解函数的重载 ,我们可以了解到一个函数的 类型 由函数的 返回值类型 以及其参数类型 及 参数个数 来决定 ,就好像 数组 不仅要有数组元素的类型 还要有数组的维度及各个维度的步长。
第2个回答  推荐于2018-02-27
这是个函数指针 前面的void为返回值类型 后面的void*为参数类型追问

可是这个一整个就是一个函数的参数啊
难道的函数指针可以使一个函数的参数吗?

追答

函数指针是可以作为某个函数的参数的,你百度下就可以查阅到相关的文章

类似这种
typedef void (*FunType)(int ); //. 定义一个函数指针类型FunType,
void CallMyFun(FunType fp,int x);

追问

我感觉这个函数指针的返回类型应该是void*,最后面括号的里的void*是参数,中间那个(*)代表的是指向函数的指针,那函数名怎么没有的?
int pthread_create(pthread_t*,const pthread_att*,void*(*)(void*),void*):整个就是这样的,帮忙看下哦

追答

(1) 指向函数的指针变量的一般定义形式为:
  数据类型 (*指针变量名)(函数参数列表)
函数名是可以缺省的 作为参数传递的时候会去调和 void*(*)(void*)这个类型相匹配的函数的

追问

也就是这个函数指针的返回类型是void* ,参数也是void*?

追答

是的 作为参数调用这个函数的时候 返回类型是void* 就相当于传了一个参数类型为void*

当然这个函数指针的参数也是void*的

追问

函数指针,指针函数,指向函数的指针,指针类型的函数的具体区别是是什么呢?

追答

简单的说:
1.函数指针 指向函数的指针 这两个是一个意思 是表示一个指针, 这个指针他指向的是一个函数
2.而指针函数 是表示一个函数 他的返回值类型为指针
具体的区别你可以百度一下 有好多文章的

追问

那么int pthread_create(pthread_t*,const pthread_att*,void*(*)(void*),void*):中 参数void*(*)(void*),是一个函数指针,如果单独开说void*(*)(void*);就是一个指针函数对吗?作为函数时候void*(*)(void*),中的函数名可不可以省略的?

追答

作为参数的时候是可以省去函数名的,当时在声明的时候不能省去

本回答被提问者和网友采纳
第3个回答  2018-06-22
这行的意义是:定义一个不具名(没有名字)的函数指针,这个函数指针指向一个函数,函数的参数为void*类型,函数的返回值为void*类型。
那如果把这个放在一个函数参数的位置,则表示该参数为上述类型的函数指针。
例如:
int Fun(void*(*pfun)(void*));则表示声明一个函数名为fun的函数,该函数的参数是一个函数指针,名字为pfun,该函数指针指向的函数是——的参数为void*类型,函数的返回值为void*类型的函数。
可以定义一个函数,将函数名(即函数指针)传入上述函数fun。
定义函数指针:void* FunToInput(void* pvoid){}
传入原函数:Fun(FunToInput);
第4个回答  2015-11-18
这位兄才回答的很好,就是最后一句话说反了,在声明的时候是可以省略掉参数名的,但是在定义的时候却不行,我想楼主应该是在函数声明中找到这段代码的吧?
相似回答