2013-10-29 48 views
0

嗨,我試圖做的函數指針數組功能,我已經試過兩件事情:數組元素類型不能爲

int (*pointer[2])(int, int);作品完美

int (*pointer)[2](int, int);不會編譯:「數組元素類型不能爲功能「

在我的理解兩個應該產生相同的結果,有什麼可以解釋的區別?

感謝您的幫助

+0

查找螺旋規則。 – chris

回答

5

像這樣的C和C++定義必須從內部讀取。從正在定義的名稱開始,繼續向右,直到您到達結束符,或聲明結束。之後,回到上一個停留點的左側,直到您找到開頭部分或聲明的開始部分(之後您再次回到右邊,等等,直到您看完整個部分)。考慮到這一點,讓我們看看你的第一個聲明/定義:

int (*pointer[2])(int, int); 

所以,從pointer開始,我們的權利繼續,直到我們得到一個閉合的括號,所以我們得到儘可能pointer is an array of 2,然後我們打括號,所以我們繼續到pointer的左邊去到星號,所以我們加pointers,給pointer is an array of two pointers。我們打開公開場面,所以我們回到右邊。我們現在在對象外面,我們找到了(int int),所以我們添加「以兩個int s爲函數」,最後我們再次向左移動,得到「並返回int」。因此,我們的整體定義是「指針是一個數組,指向帶兩個int並返回int的函數的兩個指針。」這很好,並且編譯器按預期接受它。

我們遵循同樣的想法與第二:int (*pointer)[2](int, int);

在這裏,我們馬上打右括號pointer後,讓我們直接進入pointer is a pointer,然後我們到外面去說括號(和右)和獲得「到2「的數組。然後我們繼續進行正確的操作(我們打開一個開放的文件,而不是一個關閉的文件),並獲得「採取兩個整數的函數」。在那裏我們打開了定義的末尾,所以我們回到左邊,得到「並返回int」。所以,總體定義是:「指針是一個指向兩個函數的數組的指針,它以兩個int作爲參數並返回一個int。」

由於我們不能擁有函數數組,所以會出現錯誤。


1。有些人爲此提出了諸如「螺旋規則」,「順時針規則」等名稱,但我發現這些名稱更具誤導性而不是有用的。大多數人都陷入了自己的「可愛」之中,忘記清楚地說明關於何時停止一個方向的真正規則,並開始再次尋找另一個方向。

+0

很棒的回答。我離開了我,因爲我想知道它是否仍然是錯誤的。 – Elazar

+0

@Elazar:無論如何,它們更接近。從技術上講,第二個仍然是錯誤的('fs'是指向*數組的一個*指針...) –

+0

好吧,我似乎無法做到正確。如何將一個聲明中的最後兩個示例合併(假設這不是錯誤)? – Elazar

0

始終與函數指針的typedef使用。這是最簡單的方法。

typedef int (*func_ptr)(int, int); 
typedef func_ptr fps[2]; 

fps是一種指向函數的指針數組。

你的第二個例子是像這樣:

typedef int func(int, int); // legal! defines a function type. not a pointer. 
typedef func fs[2];  // Illegal: an array of function. 

typedef fs* pfs;   // The type you tried to get: 
          // A pointer to an array of functions. 

你得到一個錯誤:「‘FS’作爲函數數組的聲明」。

+0

因爲你實際上沒有回答這個問題,所以無法贊成這個觀點:「什麼可以解釋差異」? –

+0

@j_random_hacker還是? – Elazar

+1

現在是錯的!第二個代碼段中的*號在哪裏? :-P –

相關問題