上週被算法部門的頭抓壯丁幫忙面試了幾位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指針的指針函數 |