繁体   English   中英

void* (*)() 和 void* 有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM