為什么這個函式呼叫在有和沒有“地址”運算子 ( &) 的情況下都可以作業?
如果有人可以舉出一個更簡單的例子來說明同一問題,我就會理解主要思想。
#include <iostream>
using namespace std;
void sum(int, int);
void fun(int, int, void (*)(int, int));
int main()
{
fun(3,4, &sum); // Why does this line work with and without the `&`?
return 0;
}
void sum(int a, int b)
{
cout << a b;
}
void fun(int a, int b, void (*ptr)(int, int))
{
(*ptr)(a,b);
}
uj5u.com熱心網友回復:
C 2018 6.3.2.1 3 說:
甲功能標志是具有功能型別的運算式。除非它是運算
sizeof符的運算元或一元&運算符,否則型別為“函式回傳型別”的函式指示符將轉換為型別為“指向函式回傳型別的指標”的運算式。
C 執行相同的自動轉換,盡管它的規范分布在標準中的幾個條款中。
因此,在fun(3,4, &sum);,sum并不因為這是的運算元轉換成指標&。但是然后&獲取地址,產生一個指向函式的指標。或者, in fun(3,4, sum);,sum會自動轉換為指向該函式的指標,產生相同的結果。
在 中(*ptr)(a,b),*和 括號是不必要的。函式呼叫運算子 ,從(…)技術上講將指向函式的指標作為其左運算元,因此ptr(a, b)提供該指標。在 中(*ptr)(a,b),*ptr取消對指標的參考,產生一個函式指示符。然后這個函式指示符會自動轉換回一個指標。因此,運算式等價于(&*ptr)(a, b),即等價于ptr(a, b)。
其實,如果你寫(**ptr)(a, b),*ptr變成&*ptr如上,然后*&*ptr再次產生函式指示符,也就是再次自動轉換,yield &*&*ptr,等價于ptr。您可以添加任意數量的*運算子,它們都將被自動轉換撤消;你可以寫(**************ptr)(a, b)。
還有自動轉換對應的函式引數宣告的自動調整。如果一個引數被宣告為一個函式,如在ptrof 中void fun(int a, int b, void ptr(int, int)),它會自動調整為一個指向函式的指標,就像它已經被寫入一樣void fun(int a, int b, void (*ptr)(int, int))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314980.html
上一篇:以下函式和函式呼叫是否在“driver_seat”之后插入“seat”
下一篇:如何將陣列分配給指標?
