【问题标题】:Passing function pointers as arguments [duplicate]将函数指针作为参数传递[重复]
【发布时间】:2013-03-16 14:26:23
【问题描述】:

我正在使用以下简单代码重新访问 C 中的函数指针:

unsigned TestFn(unsigned arg)
{   
    return arg+7;
}

unsigned Caller(unsigned (*FuncPtr)(unsigned), unsigned arg)
{
    return (*FuncPtr)(arg);
}

我用

来调用它
Caller(TestFn, 7)  //and
Caller(&TestFn, 7)

两者都给出了相同的输出:14. 对此有何解释。我之前一直在使用第二种调用方式。

【问题讨论】:

  • 我相信当你通过TestFn时,地址是隐式传递的,所以它的解释实际上和&TestFn一样。
  • 我认为这个问题回答了它,即使它是 C++ stackoverflow.com/questions/6893285/…

标签: c function function-pointers


【解决方案1】:

就像你传递字符串的地址而不使用 & 符号 '&' 一样,你不需要使用 & 符号来表示你正在传递 function pointer 。您可以通过 K&R 搜索该书。它包含一个很好的解释

【讨论】:

    【解决方案2】:

    这里的函数有点像数组。假设你有:

    char hello[5];
    

    你可以直接引用这个变量的地址hello——变量名“衰减”成一个指针——或者&hello,它显式地获取地址。

    函数是一样的:如果你写TestFn,它会衰减成一个函数指针。但你也可以使用&TestFn。后一种形式可能更好,因为它为更多人所熟悉。

    【讨论】:

    • Thnx,正如你所说,在 hello 和 &hello 相同的数组的情况下,我对 func ptrs 进行了实验,发现它们领先一步:&ptr、ptr、*ptr、**ptr , ****..*ptr 都一样。这似乎与取消引用将赋予元素值的数组有点不同。
    • 是的,它有点不同:当你取消引用一个函数指针时,你得到一个函数,由它的地址表示。但地址也是指针的值。所以如果 p 是一个函数指针, p == *p == **p == ...
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2020-03-07
    • 2020-11-08
    • 2017-12-02
    • 1970-01-01
    • 2021-12-18
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多