【发布时间】: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 = &fun; p2(); 会做与 p1 完全相同的事情,而不会出现警告或错误。
“fun”是函数的地址,那么&fun不应该是函数的地址吗?当我将 &fun 分配给 p2 时,我认为应该存在类型不一致。
为什么pf p2 = &fun 是合法分配?
【问题讨论】:
-
趣事:
(*p1)(); (***p1)(); (*****p1)(); -
@KerrekSB - 来吧,伙计,这太残忍了....
-
@KerrekSB 为什么会这样?编译器会直接忽略它们吗?
-
@richard.g 不,那是因为
*p1计算为函数类型的值,然后立即衰减为指向函数的指针。如果你现在取消引用它以获得一个函数,那么这个过程将无限重复。