[英]What is the difference between void* (*)() and void*?
在我的一个程序中,我收到错误
invalid conversion from 'void* (*)()' to 'void*' [-fpermissive]
我试图了解这两种数据类型之间的区别。 这很令人困惑。
我认为这些数据类型是:
void* (*)()
所以这个数据类型是一个指向 void ( void*
) 的指针,它还有另一个指针 ( (*)
),并且由于某些奇怪的原因,它有空括号。 所以我想象这个数据类型的内存看起来是|--void address--|--pointer of unknown type--|--something denoting no arguments--|
类型的|--void address--|--pointer of unknown type--|--something denoting no arguments--|
然后是void*
。 这看起来很简单,它只代表一个函数的地址。 内存模型应该像|--void address--|
一样简单 .
为什么这么奇怪,是抛出错误的函数如下。
void callFunction(void *voidThing){
void *testVariable = voidThing;
}
据我所知,这会创建一个指针类型的 testVariable,并且该指针指向 void。 该函数还接受一个指针类型的参数,该指针也指向 void。
为什么编译器会抛出错误,即使局部变量与参数类型相同? 就两者的内存占用而言,变量之间有什么区别?
这些是类型:
void *
- 指向 void 的指针(这可以指向任何对象,而不是函数)void * ()
- 不带参数并返回void *
函数void * (*) ()
- 指向不带参数并返回void *
函数的指针分别为上述各项声明标识符的示例:
void *object_ptr; // variable: pointer to object
void *function(); // function (not a variable)
void * (*function_pointer)(); // variable: pointer to function
函数类型的语法将标识符放在参数列表之前,数组也会发生类似的情况。 这称为中缀表示法。
指针声明符是后缀,即标识符在*
。
在void * (*) ()
,第一组括号是必需的,因为void * *()
将是不同的类型(声明语法导致void * *
保持在一起)。
callFunction
函数本身是正确的,但是错误消息可能来自尝试使用不正确的参数调用它,例如函数的地址。 void *
只能保存一个对象的地址。
某些平台可能允许使用reinterpret_cast
将对象指针转换为函数指针,反之亦然,此功能由实现定义的语义有条件地支持,这意味着实现可能允许也可能不允许,但必须记录行为,如果它们做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.