C ++指针函数和非指针函数

时间:2015-09-24 00:16:04

标签: c++ function pointers parameters

给定打印功能:

void print(int i)
{
    cout << i << endl;
}

为什么我们允许在主要功能中执行此操作:

void (*bar)(int);
bar = &print;

但不是这样:

void fizz(int);
fizz = print;

但是当谈到函数参数时,我们可以将指针传递给函数或函数的副本:

void foo(void (*f)(int))
{
    (*f)(1);
}

void test(void f(int))
{
    f(1);
} 

有人知道这些差异的原因吗?

3 个答案:

答案 0 :(得分:0)

函数指针可以指向具有相同参数和返回类型的任何函数。在上面的代码中,&#34; bar&#34;是指针,bar=&print表示让bar指向print。但是,函数不能=一个函数。
对函数指针有用的是,只要函数具有相同的参数和返回类型,它就可以指向ANY函数。当函数指针用作另一个函数的参数时,这证明非常有用。
当函数用作参数时,传递的真实函数是函数的ADDRESS。函数不能被解除引用(即它不能作为函数传递)。我不是很清楚,但似乎footest的实现是相同的。

答案 1 :(得分:0)

我建议从c ++ 11中读取std :: function: http://en.cppreference.com/w/cpp/utility/functional/function

这将允许您执行更多您想要的操作,其中void(int)指的是函数的返回类型和参数列表:

void fizz( std::function<void(int)> f )
{
    f(1);
}

函数现在是一流的数据类型。您甚至可以在没有任何痛苦语法的情况下使用函数进行类方法。在许多情况下,您还可以使用auto进行延迟/动态替换。此外,您可以使用相同的设置来执行有趣的操作,例如异步启动函数。

auto used_to_call_fizz = fizz;
used_to_call_fizz( f );
std::async( used_to_call_fizz, f );

答案 2 :(得分:0)

每个函数都有自己的地址,您可以将其视为array。函数void fizz(int)void print(int i)具有不同的内存地址,因此fizz = print;会出错。但是你使用void (*bar)(int);,它显示了一个函数指针,用于指向一个函数。当您使用bar=&print时,它将初始化bar指针,然后获得正确答案。顺便说一下,您可以使用bar=print,因为它们具有与array相同的内存地址。我希望这可以帮到你。