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

2 回答 2

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)不一样;前者是不合法的。

于 2012-08-08T17:28:37.250 回答
0

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

pFcn 给出它所指向的函数的地址,在这种情况下是函数 Add 的地址。pFcn(1,2) 调用该函数。

于 2012-08-08T17:38:45.680 回答