c++ - void* (*)() 和 void* 有什么区别?

标签 c++ pointers types microcontroller avr

在我的一个程序中,我收到错误

invalid conversion from 'void* (*)()' to 'void*' [-fpermissive]

我试图理解这两种数据类型之间的区别。这很令人困惑。

我认为这些数据类型是:
void* (*)() 所以这个数据类型是一个指向 void (void*) 的指针,它还有另一个指针 ((*) >),并且出于某种奇怪的原因,它有空括号。所以我想象这种数据类型的内存看起来像 |--void 地址--|--未知类型的指针--|--表示没有参数的东西--|

然后是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将对象指针转换为函数指针,反之亦然,此功能有条件地支持实现定义的语义,这意味着实现可能允许也可能不允许,但如果允许,则必须记录行为。

关于c++ - void* (*)() 和 void* 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60107782/

相关文章:

c++ - 带有 const ref 参数的自赋值行为

c++ - 如何阻止客户端向服务器发送消息?

c++ - 如何将双指针分配给数组? C/C++

C++ 指针作为 DWORD

php 从 mysql 中选择并接收数据类型

types - Erlang 中非终止函数的类型

c++ - asio 异步服务器不接受连接

c - 为什么这个 C 指针代码不起作用?

go - 为什么接受自定义结构来代替错误?

c++ - 代码块电源功能在 c 中不起作用