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 に答える