兩個規則輕鬆解讀複雜的聲明

上週被算法部門的頭抓壯丁幫忙面試了幾位AE的候選人,這個職位對編程水平的要求其實並不算高,能看懂C或者C++代碼,並且可以根據客戶的要求做一些小的修改即可。幾位候選人都在知名外企工作多年,職位估計也不低,年齡也比我大一點。要求候選人現場手寫代碼,真是有點太難爲情,但又不能不仔細考察。在網上找了幾道指針和位操作相關的題,結果讓我頗感意外,竟然沒有答對的。大外企大國企大鍋飯廢人不假,但是面試前臨時抱佛腳也是應該有的吧?不過也可能是人家看不上我們小公司,權當練手罷了。
廢話少說,也貼一道抄來的面試題:解讀聲明int *(*x[10]) (void)?
C語言設計相關的教材裏面講得很清楚,無論多麼複雜的聲明,兩個規則來解讀:
1. 從內往外解讀聲明符
換句話說,找到聲明的標識符,並且從此處開始解讀。
2. [ ]和( )優先級高於*
如果在標識符前面,而標識符後面跟着[ ],那麼標識符表示數組而不是指針。同樣的,如果在標識符前面,而標識符後面跟着( ),那麼標識符表示函數而不是指針。
舉例:

聲明 解讀
int *ap[10]; ap是指向int的指針數組
float *fp(float); fp是指向float的指針函數
void (*pf)(int); pf是指向形參爲int,返回值爲void的函數指針
int *(*x[10]) (void); x是大小爲10且指向某函數的指針數組,此函數沒有輸入參數,返回值爲int指針
char (*x[10])(int); x是大小爲10且指向某函數的指針數組,此函數輸入爲1個int,返回值爲char
int (*x(int))[5]; x是指針函數,此函數的輸入爲1個int,返回值爲指向大小爲5的int數組的指針
float *(*x(void)) (int); x是指針函數,指向一個沒有輸入參數且返回值爲指針函數y的函數;y是輸入爲1個int,返回值爲float指針的指針函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章