2014-09-02 57 views
-4

下面的數組聲明的類型是什麼?誰能爲我清楚說明什麼價值?不同數組聲明的類型

int main() { 
    int* arr[3]; 
    int(*arr)[3]; 
    int*(arr[3]); 
} 
+2

http://c-faq.com/decl/spiral.anderson.html – chris 2014-09-02 13:19:06

+3

http://cdecl.org/ – P0W 2014-09-02 13:20:20

+2

第一個和第三個是一樣的。 – 2014-09-02 13:21:02

回答

7

您可以使用cdecl助陣:

  • int *arr[3]賦予 「聲明改編爲指針數組3爲int」。
  • int (*arr)[3]給出 「聲明ARR作爲指針整型陣列3」
  • int*(arr[3])給出 「聲明ARR作爲指針的陣列3爲int」。

此外,當然這些不是「真正」的聲明;沒有終止分號,並且在同一範圍內不能有三個名爲arr的變量。

3

它’通常知道您使用的語言而不是依靠工具來破譯源代碼是一個好主意,所以我不建議使用C聲明分析器。


一個簡單的方法來記住的優先級是要記住的main簽名,即

auto main(int argc, char* argv[]) 
    -> int 

…你知道argv是一個指針數組(或者技術上指向這樣一個數組的第一個元素的指針:聲明衰減到char** argv)。

這意味着,給定argv可以索引它來得到一個指針,argv[i],然後解引用,結果得到一個char,使相當於括號內聲明

char* (argv[]) 

聲明

char (*b)[3] 

表示通過取消引用b*b,你得到一個可以索引的數組,(*b)[],所以b是一個指向數組的指針。

它’ s不是指向此類數組的第一項的指針。它是’的一個指向的陣列本身。因此,將1加到b會給你一個指向相同大小的後續數組的指針。

0

後綴運營商如[]和函數調用()具有比一元*更高的優先級,所以像*a[N]一個聲明將被解析爲*(a[N]),或「指針的N元件陣列」。要聲明「指向N元素數組的指針」,您需要明確地將一元*與數組名稱或(*a)[N]分組。

這是一個方便的圖表。

T a[N]   -- N-element array of T 
T *a[N]  -- N-element array of pointer to T 
T (*a)[N]  -- pointer to N-element array of T 
T f()   -- function returning T 
T *f()   -- function returning pointer to T 
T (*f)()  -- pointer to function returning T 

您可以結合到上述情況相當複雜聲明:

T (*a[N])()  -- N-element array of pointers to functions returning T 
T (*f())[N]  -- Function returning pointer to N-element array of T 
T (*(*f())[N])[M] -- Function returning pointer to N-element array of pointer 
         to M-element array of T 

當讀取一個毛茸茸的聲明,先從最左邊的標識和工作的方式了,記住上面的規則:

 f   -- f 
     f()   -- is a function returning ("()" has higher precedence than "*") 
    *f()   -- a pointer to 
    (*f())[N]  -- an N-element array of 
    *(*f())[N]  -- pointers to 
    (*(*f())[N])[M] -- M-element arrays of 
T (*(*f())[N])[M] -- T