2009-10-01 47 views
3

雖然幾乎所有的時候我都用std::vector,但我很想盡可能多地瞭解指針。我正在談論的示例:如何解碼指針+數組的複雜聲明?

char* array[5]; // What does it mean? 
// 1) pointer to an array of 5 elements! 
// 2) an array of 5 pointers? 

我對此聲明的確切定義感興趣。

回答

3

不只是指針和數組:How to interpret complex C/C++ declarations

開始讀取來自 最裏面括號中的聲明,向右走,並 然後向左走。當你遇到 的括號時,方向應該是 顛倒過來。一旦所有的 圓括號都被解析出來,跳出它的 。繼續,直到整個 聲明已被解析。

一個小改動,右左 規則:當你開始閱讀 聲明,第一次,你 必須從標識符開始, 不是最裏面的括號。

您例如:

char* array[5]; 

是5個指針數組爲char。

+0

謝謝,好文章:) – AraK 2009-10-01 00:15:11

1

char *是類型,並且您有5個數組。

3

cdecl是一個非常適合這種事情的程序。 (特別是當你添加函數指針混進去!)

Type `help' or `?' for help 
cdecl> explain char* foo[5] 
declare foo as array 5 of pointer to char 
cdecl> declare bar as array 5 of pointer to function (integer, integer) returning char 
char (*bar[5])(int , int) 
+0

鏈接到網站:http://www.cdecl.org/ – Casebash 2010-09-09 11:48:20

2

我從一些雜誌的一篇文章瞭解到順時針/螺旋規則很久以前。下面是介紹該技術的在線文章:

它使我受益匪淺,但我還是有些怪異基於模板的聲明我有時遇到的境地鬥爭。

1

[]比*有更高的優先級,這就是爲什麼它是一個指針數組,而不是相反。

+0

哪一個具有更高的優先級,[]或()? – qed 2014-01-27 13:10:43

1

您總是閱讀從右向左解釋'*'作爲指針的指針。 例如字符**一個[5]是5個指針數組的字符指針...

2

在C/C++讀取類型的一般過程是:

  1. 確定最終的類型,它可以是基本類型或typedef標識符,並且可以具有類型修飾符,如const,volatile等。在您的示例中,它是「char」。
  2. 將運算符與優先級相同的順序應用到標識符中,正如它們在表達式中的一樣。這些運算符可以是*(取消引用),[](索引)和()(調用函數)。

在語法的原始哲學中,您的示例應該寫成「char * array [5]」,標識符是「數組」,操作符是[](索引),然後是*(取消引用)。

該聲明然後讀取爲合同「如果您按順序應用這些運算符,那麼您將得到最終類型的對象」。

在你的情況下,完整的句子是「如果你索引變量」數組「,然後解引用結果表達式,你會得到一個字符」。

你也可以認爲它像「如果你的索引變量‘陣列

’,那麼你如果取消引用它,你就會得到一個char得到一個對象,說:」關鍵是大多保持跟蹤[]和()的優先級高於*。您可以像使用正則表達式一樣使用括號來控制操作符的順序。

+0

哪一個具有更高的優先級,[]或()? – qed 2013-11-04 20:35:23

+0

這是迄今爲止我發現的最清晰的解釋。 – qed 2013-11-04 20:38:17