雖然幾乎所有的時候我都用std::vector
,但我很想盡可能多地瞭解指針。我正在談論的示例:如何解碼指針+數組的複雜聲明?
char* array[5]; // What does it mean?
// 1) pointer to an array of 5 elements!
// 2) an array of 5 pointers?
我對此聲明的確切定義感興趣。
雖然幾乎所有的時候我都用std::vector
,但我很想盡可能多地瞭解指針。我正在談論的示例:如何解碼指針+數組的複雜聲明?
char* array[5]; // What does it mean?
// 1) pointer to an array of 5 elements!
// 2) an array of 5 pointers?
我對此聲明的確切定義感興趣。
不只是指針和數組:How to interpret complex C/C++ declarations:
開始讀取來自 最裏面括號中的聲明,向右走,並 然後向左走。當你遇到 的括號時,方向應該是 顛倒過來。一旦所有的 圓括號都被解析出來,跳出它的 。繼續,直到整個 聲明已被解析。
一個小改動,右左 規則:當你開始閱讀 聲明,第一次,你 必須從標識符開始, 不是最裏面的括號。
您例如:
char* array[5];
是5個指針數組爲char。
char *是類型,並且您有5個數組。
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)
鏈接到網站:http://www.cdecl.org/ – Casebash 2010-09-09 11:48:20
我從一些雜誌的一篇文章瞭解到順時針/螺旋規則很久以前。下面是介紹該技術的在線文章:
它使我受益匪淺,但我還是有些怪異基於模板的聲明我有時遇到的境地鬥爭。
您總是閱讀從右向左解釋'*'作爲指針的指針。 例如字符**一個[5]是5個指針數組的字符指針...
在C/C++讀取類型的一般過程是:
在語法的原始哲學中,您的示例應該寫成「char * array [5]」,標識符是「數組」,操作符是[](索引),然後是*(取消引用)。
該聲明然後讀取爲合同「如果您按順序應用這些運算符,那麼您將得到最終類型的對象」。
在你的情況下,完整的句子是「如果你索引變量」數組「,然後解引用結果表達式,你會得到一個字符」。
你也可以認爲它像「如果你的索引變量‘陣列
’,那麼你如果取消引用它,你就會得到一個char得到一個對象,說:」關鍵是大多保持跟蹤[]和()的優先級高於*。您可以像使用正則表達式一樣使用括號來控制操作符的順序。
謝謝,好文章:) – AraK 2009-10-01 00:15:11