Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个函数指针怎么可能不指向函数?_C++ - Fatal编程技术网

C++ 这个函数指针怎么可能不指向函数?

C++ 这个函数指针怎么可能不指向函数?,c++,C++,为什么指针函数*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) <<

为什么指针函数
*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;
}
intadd(intnx,intny)
{
返回nX+nY;
}
int main()
{
//创建一个函数指针并使其指向Add函数
整数(*pFcn)(整数,整数)=相加;

cout如果
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);
模板R调用(R(*f)(Args…,Args…)
{
返回f(args…);
//坏:“&f”没有用
}
调用_p(add,1,2);

模板R调用(R&f)(Args…,Args…)
{
返回f(args…);
//好:“&f”是预期的函数指针
}
调用(添加,1,2);

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

printf(“%p\t%p”,pFcn,Add)


pFcn给出了它所指向的函数的地址,在本例中是函数Add的地址。pFcn(1,2)调用该函数。

“它指向Add,而Add不是&Add”--是的,函数名可以隐式转换为函数指针。无论如何,I+1ed,但第一句话不太正确:
foo
不表示指向函数的指针(如您的示例所示)@R.MartinhoFernandes:是的,我也不太满意。现在好了吗?第一句话几乎是对的,就是说,直到语言律师出现……函数并不总是衰减为指针,尽管很少有不衰减的情况。你可以尝试获取对函数的引用和对指向同一函数的指针的引用查看函数不衰减的情况。对于不太复杂的示例,应用于函数和应用于指针的运算符的地址将不同。
&f
有效,而
&f
无效。
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);