2012-08-08 173 views
3

爲什麼指針功能*pFcn不指向地址?它指向Add,這不是&Add。也不返回地址。這是爲什麼?這個函數指針如何不能指向一個函數?

int Add(int nX, int nY) 
{ 
    return nX + nY; 
} 

int main() 
{ 
    // Create a function pointer and make it point to the Add function 
    int (*pFcn)(int, int) = Add; 
    cout << pFcn(5, 3) << endl; // add 5 + 3 

    return 0; 
} 
+4

「它指向Add which is&Add」 - 它是,一個函數名可以隱式轉換爲一個函數指針。 – Xeo 2012-08-08 17:28:11

回答

4

如果foo是一個函數,那麼(除了在某些特定情況下*)都foo&foo表達的指針功能:函數立即衰減到指向自己,所以foo(x)(*foo)(x)(**foo)(x)都是相同。


當給定一個選擇,更喜歡通過引用傳遞函數,而不是由值,雖然:

template <typename R, typename ...Args> R invoke(R (*f)(Args...), Args... args) 
{ 
    return f(args...); 

    // bad: "&f" is not useful 
} 
invoke_p(add, 1, 2); 

template <typename R, typename ...Args> R invoke_r(R (&f)(Args...), Args... args) 
{ 
    return f(args...); 

    // good: "&f" is the expected function pointer 
} 
invoke_r(add, 1, 2); 

*)例如,sizeof(foo)sizeof(&foo)不一樣;前者不合法。

+0

無論如何,I + 1ed,但第一句話是不完全正確的:'foo'不表示指向函數的指針(如您的示例所示)。 – 2012-08-08 17:32:23

+0

@ R.MartinhoFernandes:是的,我也不太滿意。現在好多了? – 2012-08-08 17:34:58

0

printf("%p\t%p",pFcn,Add)

pFcn給出了它指向在這種情況下是功能可按地址添加函數的地址。 pFcn(1,2)調用該函數。

相關問題