c函數指針的優先級規則---怎麼來讀一個很長的聲明呢? [轉]

在c中優先級別的次序是這樣的。
1. 聲明中給括號包圍起來的那部分。
2.後綴操作符。
3.前綴操作符。*表示“指向……的指針”
4.如果const&volatile關鍵字的後面緊跟類型說明符號(如int),那麼它作用於類型說明符,在其他情況下左邊緊接的類型指針。
              
              ---《c專家編程》


那麼♂來看一個例子

char * const *(*next)();

首先♂來看括號裏面的,看變量名next,根據上面第3點,♂可以認爲:“next是一個指向……的指針”。
ok,我們繼續。
接下來,後面是一個括號,那麼♂可以這麼讀,“next是一個函數指針,指向一個返回……的函數”,很明白吧。
在後來,const前邊有一個*,那麼很清楚
這個聲明可以理解爲:“next是一個指針,指向一個函數,該函數返回一個指針,這個指針指向一個類型爲char的常量指針。”(此處經過悠然自得得點撥,修改。)


好了,具體就這麼多,

來個例子看看自己會了沒有?答案在後面。

1.char*(*c[10])(int**p);
2.void(*signal(int sig,void(*func)(int)))(int);

對於1:c是一個數組,裏面的元素類型是函數指針,這些函數返回的是一個指向char的指針,這些函數的參數是一個指向指針的指針。

對於2:signal是一個函數,返回一個函數指針。後者指向的函數接受一個int參數,返回void

=========================================================================
對於char * const * (*next)();

next是一個函數指針沒錯,但這個函數返回的不是一個類型爲char的常量指針,而是一個指向char的二重指針,並且其值,也就是第一重指針爲常量,但它本身不是常量。

具體來說,如果char * const * p; p是一個二重指針,p本身不是常量指針,*p纔是常量指針。如果p是這樣定義的:char * const p;這時候p纔是一個類型爲char的常量指針。
-------------------------------------------------------------------------
next是一個函數指針,這個函數返回一個指針,這個指針指向一個類型爲char的常量指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章