2012-02-16 165 views
3

是什麼這兩個聲明的區別:C函數指針混亂

int operate(int (*func)(int, int), int a, int b){ 
    return (*func)(a, b); 
} 

int operate(int func(int, int), int a, int b){ 
     return func(a, b); 
} 

這兩個似乎也是相同的:operate(sum, 1, 1)operate(&sum, 1, 1)

如果我通過功能sum如在func的地方2號的功能,其結果仍然是相同的。爲什麼?

回答

4

§6.7.5.3/ 8:

一個參數爲「」函數返回類型「」,應調整至「」函數指針返回類型「」,如在6.3的聲明。 2.1。

換句話說,這兩個函數聲明是相同的。

至於函數調用去,§6.5.2.2/ 3:

包含表達式的可能是空的,用逗號分隔的列表 後綴表達式後跟括號()是一個函數調用。後綴表達式表示被調用函數。

由於兩個func(a, b);(*func)(a, b)是後綴表達式後跟括號,它們都是函數調用。由於func(*func)都指定相同的功能,它們都調用相同的功能。

3

兩個函數原型是等價的。從C99,6.7.5.3:

一個參數的聲明爲「‘函數返回類型’」,應調整至「‘函數指針返回類型’」,如在6.3.2.1。

兩個函數調用(operate(sum, 1, 1)operate(&sum, 1, 1))等價;一個函數在大多數上下文中衰減爲函數指針(類似於數組如何衰減爲指向其第一個元素的指針)。從C99開始,6.3.2.1:

函數指示符是一個具有函數類型的表達式。除了當它是sizeof操作者或一元&操作者,功能指示器與 類型「‘函數返回類型’的操作數 」被轉換爲已輸入「‘指針 函數返回類型’」的表達式。

+0

約衰減第二段是外的地方,我想。無腐爛發生的事情,除非你計數'(* FUNC)'作爲函數和'func'爲指針它衰變到...? – 2012-02-16 16:59:48

+0

@R:哦,我明白了。我指的是「操作(sum,1,1)」與「操作(&sum,1,1)」。 – 2012-02-16 17:01:14

+0

哦,我明白了.. – 2012-02-16 17:02:59