【问题标题】:pointers to functions in c++c++中的函数指针
【发布时间】:2013-12-02 23:15:01
【问题描述】:

给我的问题命名有点困难,所以请原谅我这个模棱两可的标题。

函数名被认为是函数的地址,因此我们可以将它们分配给函数指针。

...
void fun(){cout<<"fun called";}  
int main()
{
typedef void (*pf)();
pf p1 = fun;
//Then we can call p1()
p1();
...
}

这没问题。令我困惑的是,pf p2 = &amp;fun; p2(); 会做与 p1 完全相同的事情,而不会出现警告或错误。

“fun”是函数的地址,那么&fun不应该是函数的地址吗?当我将 &fun 分配给 p2 时,我认为应该存在类型不一致。 为什么pf p2 = &amp;fun 是合法分配?

【问题讨论】:

  • 趣事:(*p1)(); (***p1)(); (*****p1)();
  • @KerrekSB - 来吧,伙计,这太残忍了....
  • @KerrekSB 为什么会这样?编译器会直接忽略它们吗?
  • @richard.g 不,那是因为*p1 计算为函数类型的值,然后立即衰减为指向函数的指针。如果你现在取消引用它以获得一个函数,那么这个过程将无限重复。

标签: c++ function pointers


【解决方案1】:

没有。

由函数名衰减到函数指针的id-expression,在某些情况下except。其中一种情况是它是地址运算符的操作数。在这种情况下它不会衰减,并且在函数名上计算地址运算符的结果是函数的地址。

【讨论】:

    【解决方案2】:

    函数名被认为是函数的地址

    “fun”是函数的地址

    这些说法都不正确。函数名不是指针而是函数指示符;只有这种情况 - 类似于数组 - 在某些(但不是全部)上下文中隐式转换为指针(“衰减为指针”),例如,当分配给指向函数或调用时类型的对象。

    当函数是一元 &amp; (address-of) 运算符的参数时,这种隐式转换确实不会发生,因此 &amp;function_name 将是“指向函数的指针”类型,并且不是“指向函数的指针”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-23
      • 2010-11-19
      • 2021-10-30
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多