[英]function type vs. function pointer type
我試圖理解以下兩個代碼塊之間的區別:
void f(int (*func)(int))
{
func(5);
}
和
void g(int (func)(int))
{
func(5);
}
在給定以下代碼的情況下,兩個函數的工作方式相同:
int blah(int a)
{
cout << "hello" << endl;
return 0;
}
int main()
{
f(blah);
g(blah);
return 0;
}
但是,如果我寫下面的代碼:
int (*foo)(int);
int (goo)(int);
foo = blah;
goo = blah;
我得到goo = blah的編譯錯誤。 但是在第一個例子中,我可以調用make函數調用g(blah) ,它看起來與goo = blah非常相似。 為什么一個工作而另一個工作?
有點令人困惑的是,您可以聲明一個函數將函數作為參數(即使這沒有意義),效果是使參數成為函數指針。 這類似於聲明一個看起來像數組的函數參數的方式,但實際上是一個指針。
函數參數可以是函數的名稱,有或沒有&
顯式獲取其地址。 如果省略&
,則會出現隱式的函數到指針轉換。 同樣,這類似於向數組傳遞(指針),其中隱式數組到指針轉換意味着您只需要編寫數組的名稱,而不是&array[0]
。
在聲明變量時,該規則不適用; int goo(int);
(在goo
周圍有或沒有不必要的括號)聲明一個函數,而不是一個指針,你不能分配給函數。
它類似於數組和指針之間的區別,例如,如果你有:
char *foo;
char bar[N];
你可以做:
foo = bar;
但你做不到:
bar = foo;
當函數類型在參數聲明中使用時,它被轉換為等效函數指針,就像聲明:
void fun(int arr[]);
被翻譯成:
void fun(int *arr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.