簡體   English   中英

函數類型與函數指針類型

[英]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.

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