兩個規則輕鬆解讀複雜的宣告

2021-10-06 07:42:05 字數 1055 閱讀 5172

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

兩個函式宣告的理解

1 當今計算機啟動時,硬體會去呼叫位址為0的函式,用c語言模擬這個過程,應該如何宣告這個函式?呼叫某個函式,c語言中一般會利用指向函式的指標,即如下形式 void f void 上面的表示式的意思是,f是指向函式的指標,指向的函式的形式是 引數是void型別的,返回值也是void型別的。這個很好理解...

兩個函式宣告的理解

1 當今計算機啟動時,硬體會去呼叫位址為0的函式,用c語言模擬這個過程,應該如何宣告這個函式?呼叫某個函式,c語言中一般會利用指向函式的指標,即如下形式 void f void 上面的表示式的意思是,f是指向函式的指標,指向的函式的形式是 引數是void型別的,返回值也是void型別的。這個很好理解...

C 類前置宣告的兩個用處

類前置宣告 只是宣告了類 class qcheckbox 而不提供類定義。用處1 交叉引用。類a用了類b,而b又反過來用了a。事實上我們只能先對乙個類進行定義,要麼a,要麼b。假設我們先對a進行定義,那麼在a中必須使用到b,而此時b還沒有定義。這種情況下,可以對b進行類前置宣告,即在定義a之前,宣告...