簡體   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