2010-09-14 68 views
17

此問題遵循this other question about C declarations。閱讀這個問題的答案,我讀了關於spiral rule,我也明白「申報遵循使用」是什麼意思。解析C和C++聲明的螺旋規則和'聲明遵循用法'

好吧。但後來我讀this declaration

char *(*(*a[N])())(); 

,我想知道如何使用它解析「聲明如下用法」「規則」。特別是對於數組部分。

我讀的是:

(*(*a[N])()) 

是返回char *,那麼,取消引用下面的

(*a[N])() // 1 

是這個 '函數返回一個char*' 功能(),所以1是'指向函數返回char *' 然後我會說'當調用(*a[N])時,它是[先前的聲明]'。在這一點上,我們有(*a[N])是一個函數返回指向返回char *函數的指針。

但後來我不知道如何應用這個規則來區分'指針數組'和'指針數組'。

有人可以澄清這一點嗎?

其他問題:在這樣的聲明中,&(C++中),*[]之間有什麼規則的「優先級」? [也許「優先級」不是正確的術語]


要檢查是否我明白了「螺旋規則」正確地,我也解析低於這個表達式;請告訴我,如果我錯了。

 +-----------+ 
     | +------+ | 
     | | +-+ | | 
     | |^| | | 
char* (*(* a[N])())(); 
    ^^^^^^
    | | | | | | 
    | | +---+ | | 
    | +--------+ | 
    +--------------+ 

對我來說很容易(通過循環迴路):

  • a是N的陣列...
  • 函數指針返回...
  • 函數指針返回...
  • char *

但我可能錯過了一些在這種情況下讓我獲得正確答案的東西,但在另一個更復雜的情況下可能會出錯。

+0

@Vality:如果你打算放棄C++標籤,你需要在C++中刪除'&'。 – 2015-12-31 22:36:38

+0

@JonathanLeffler好點,通常我會說這需要分成兩個問題,但是我不願意這麼做。 – Vality 2016-01-01 02:21:10

+0

@Vality這個問題突然得到如此關注? (我被通知了'好問題'徽章)。 – 2016-01-01 10:20:49

回答

12

你只需要逐步建立它。

char *X(); // X =~ (*(*a[N])()) 

函數返回char*

char *(*Y())(); // Y =~ (*a[N]) 

函數返回指針函數返回char*

在聲明,正如在表達式(聲明後續使用),後綴[]具有更高的優先級的是一元*所以*a[N]相當於*(a[N]),不(*a)[N]

char *(*(*Z)())(); // Z =~ a[N] 

指向函數返回指針的指針返回char*

char *(*(*a[N])())(); 

指向函數的N個指針數組返回指向函數的指針返回char*