在原來的聲明裏逐步用別名替換一部分複雜聲明,如此循環,把帶變量名的部分留到最後替換,獲得的就是原聲明的最簡化版。數組
舉例:
原聲明:void (*b[10]) (void (*)())
函數
變量名爲b,先替換右邊部分括號裏的,pFunParam爲別名一:指針
typedef void (*pFunParam)()
code
再替換左邊的變量b,pFunx爲別名二:變量
typedef void (*pFunx)(pFunParam)
循環
原聲明的最簡化版:co
pFunx b[10]
閱讀
原聲明:doube(*)() (*e)[9]
運算符
變量名爲e,先替換左邊部分,pFuny爲別名一:void
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。
這種用法是比較複雜的,出現的頻率也很多,每每在看到這樣的用法卻不能理解,相信以上的解釋能有所幫助。