嗨,我試圖做的函數指針數組功能,我已經試過兩件事情:數組元素類型不能爲
int (*pointer[2])(int, int);
作品完美
int (*pointer)[2](int, int);
不會編譯:「數組元素類型不能爲功能「
在我的理解兩個應該產生相同的結果,有什麼可以解釋的區別?
感謝您的幫助
嗨,我試圖做的函數指針數組功能,我已經試過兩件事情:數組元素類型不能爲
int (*pointer[2])(int, int);
作品完美
int (*pointer)[2](int, int);
不會編譯:「數組元素類型不能爲功能「
在我的理解兩個應該產生相同的結果,有什麼可以解釋的區別?
感謝您的幫助
像這樣的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。有些人爲此提出了諸如「螺旋規則」,「順時針規則」等名稱,但我發現這些名稱更具誤導性而不是有用的。大多數人都陷入了自己的「可愛」之中,忘記清楚地說明關於何時停止一個方向的真正規則,並開始再次尋找另一個方向。
始終與函數指針的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’作爲函數數組的聲明」。
因爲你實際上沒有回答這個問題,所以無法贊成這個觀點:「什麼可以解釋差異」? –
@j_random_hacker還是? – Elazar
現在是錯的!第二個代碼段中的*號在哪裏? :-P –
查找螺旋規則。 – chris