在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。
舉例:
原宣告:void (*b[10]) (void (*)())
變數名為b,先替換右邊部分括號裡的,pFunParam為別名一:
typedef void (*pFunParam)()
再替換左邊的變數b,pFunx為別名二:
typedef void (*pFunx)(pFunParam)
原宣告的最簡化版:
pFunx b[10]
原宣告:doube(*)() (*e)[9]
變數名為e,先替換左邊部分,pFuny為別名一:
typedef double(*pFuny)()
再替換右邊的變數e,pFunParamy為別名二:
typedef pFuny (*pFunParamy)[9]
原宣告的最簡化版:
pFunParamy e
理解複雜宣告可用的“右左法則”:從變數名看起,先往右,再往左,碰到一個圓括號
就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直
到整個宣告分析完。舉例:
int (*func)(int *p)
首先找到變數名func,外面有一對圓括號,而且左邊是一個*號,這說明func是一個指標
;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是一個函式,所以
func是一個指向這類函式的指標,即函式指標,這類函式具有int*型別的形參,返回值
型別是int。
int (*func[5])(int *)
func右邊是一個[]運算子,說明func是具有5個元素的陣列;func的左邊有一個*,說明
func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的,原因是[]運算子
優先順序比*高,func先跟[]結合)。跳出這個括號,看右邊,又遇到圓括號,說明func數
組的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int。
這種用法是比較複雜的,出現的頻率也不少,往往在看到這樣的用法卻不能理解,相信以上的解釋能有所幫助。