簡體   English   中英

C函數指針混亂

[英]C function pointer confusion

這兩個聲明有什么區別:

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)

如果我在func處將函數sum作為2個數的函數傳遞,結果仍然相同。 為什么?

§6.7.5.3/ 8:

參數聲明為''函數返回類型''應調整為''函數返回類型的指針'',如6.3.2.1所述。

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

就函數調用而言,§6.5.2.2/ 3:

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

既然都是func(a, b); (*func)(a, b)是后綴表達式,后跟括號,它們都是函數調用。 由於func(*func)都指定相同的函數,因此它們都調用相同的函數。

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

參數聲明為''函數返回類型''應調整為''函數返回類型的指針'',如6.3.2.1所述。

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

函數指示符是具有函數類型的表達式。 除非它是sizeof運算符或一元&運算符的操作數,否則具有類型''函數返回類型''的函數指示符將轉換為具有類型''指向函數返回類型'的指針的表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM