0

可能重复:
为什么所有这些疯狂的函数指针定义都有效?到底发生了什么?

我将不胜感激在代码中解释原因

void f(int& i)
{
  i++;
}

void g(void (passed_f)(int&),int& a)   //`passed_f` equivalent to `*passed_f`
{
  passed_f(a);
}

int main()
{
  int n=0;
  g(f,n);                              //`f` is equivalent to `&f`
}

从不产生任何错误并给出完全相同的结果的意义上说,这两个等式都成立1。看来,我们是否接受g指向函数的指针或函数本身并不重要......我还认为 [c]-tag 是合适的。

4

2 回答 2

2

passed_f确实等同于*passed_f,编译器将从两者创建相同的输出。区别只是惯用的。有些人更喜欢后一种形式,因为它更清楚地表达了我们有一个指向函数的指针,并且这种表示法与用于其他类型的指针表示法更一致。

于 2012-04-19T19:35:38.663 回答
2

函数指针在 C 中是特殊的:

  • 函数的名称,比如说f函数指示符&f而是函数指针;
  • 间接函数指针计算为函数指示符;
  • 间接函数指示符对函数指示符本身求值;
  • 因此,您可以将函数指针f称为f()(*f)()(**f)()等。

如果您将函数名称视为几乎所有用途的指针,这是有道理的。尝试编译这个版本的 Hello World:

int main()
{
    // try replacing * with & or adding more *s
    (*printf)("Hello, world!\n");
    return 0;
}

在 C 标准中,这在第 6.3.2.1 段中有所涵盖。不确定 C++ 标准。

于 2012-04-19T19:43:49.557 回答