簡體   English   中英

C中這兩個令人困惑的函數指針表示法之間的區別?

[英]Difference between these two confusing function pointer notations in C?

C中這兩個函數指針符號有什么區別?

void (*a[]())void (*a)()[]

它們是否都表示相同 - 一個指向函數的指針數組 - 或者第二個表示指向函數數組的指針?

我該如何調用這些函數 - 比如void (*a[]()) = {swap, add, sub, prod};

這是否意味着a是4個元素的函數指針數組,而a[0] ... a[3]中有swapaddsubprod的地址。 我該怎么調用這些函數呢?

*a[i]()

或者像這樣?

a[i]()

使用cdecl.org來解決這個問題,直到你可以不考慮它為止。

void (*a[]()) :聲明一個函數數組,返回指向void的指針

void (*a)()[] :聲明一個指向函數返回void的數組的指針

后者無效C.

他們都無效。

void (*a[]());

被解釋為

       a        -- a
       a[]      -- is an array
       a[]()    -- of function
      *a[]()    -- returning pointer
void (*a[]())   -- to void.

您不能聲明函數類型的數組。 同樣的,

void (*a)()[]

被解釋為

       a       -- a
     (*a)      -- is a pointer
     (*a)()    -- to a function
     (*a)()[]  -- returning an array of unknown size
void (*a)()[]  -- of void.

函數不能返回數組類型,也不能有void數組。

如果你想聲明一個指向返回void函數的指針數組,你可以將它構建為:

       a          -- a
       a[N]       -- is an N-element array
      *a[N]       -- of pointers
     (*a[N])()    -- to functions
void (*a[N])();   -- returning void

因此, void (*a[N])(); a聲明為返回void函數的指針數組。 您將數組中的每個單獨函數調用為

(*a[i])();

要么

a[i]();

雖然我更喜歡第一種形式,即使它更混亂。

因此,給定函數列表swapaddsubprod ,您將構建數組

void swap() {...}
void add() {...}
void sub() {...}
void prod() {...}
...
void (*a[])() = {swap, add, sub, prod};
...
(*a[0])(); // calls swap
(*a[1])(); // calls add

給定函數名稱,我假設它們采用某種形式的參數。 請注意,數組中的所有函數指針都應具有相同的簽名 ; 也就是說,它們都應該具有相同的返回類型,以及相同數量和類型的參數。

當您通過指針調用函數時,C允許您刪除顯式取消引用,因此您可以將這些函數稱為

 a[0]();
 a[1]();

但我更喜歡第一種形式,即使它在視覺上更混亂。

請記住, []和函數調用()優先級高於一元* ,因此T *a[N]聲明指向T的指針的N元素數組, T (*a)[N]聲明指向T (*a)[N]的指針元素數組TT *f()聲明一個函數返回一個指向T的指針, T (*f)()聲明一個指向返回T的函數的指針。

根據C中的Right-Left-Rule這里的其他參考),編譯器認為這兩個表達式都是無效的(也可能是標准的)。

第一個是函數數組,后者是一個空洞數組。

函數返回void的指針數組將是

void (*a[])()

第二個表達式在C中無效,因為它首先不允許void數組,第二個表達式不允許函數返回數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM