C++指针函数和非指针函数
C++ pointer function and non-pointer function
给定一个打印函数:
void print(int i)
{
cout << i << endl;
}
为什么我们可以在 main 函数中这样做:
void (*bar)(int);
bar = &print;
但不是这个:
void fizz(int);
fizz = print;
但是当涉及到函数参数时,我们可以传递一个指向函数的指针或者函数的副本:
void foo(void (*f)(int))
{
(*f)(1);
}
void test(void f(int))
{
f(1);
}
有人知道这些差异的原因吗?
函数指针可以指向具有相同参数和return类型的任何函数。在你上面的代码中,"bar"是一个指针,bar=&print
意味着让bar
指向print
。但是,函数不能 =
函数。
函数指针的好处在于它可以指向任何函数,只要函数具有相同的参数和 return 类型即可。当一个函数指针作为另一个函数的参数时,这被证明是非常有用的。
当函数用作参数时,传递的实际内容是函数的地址。函数不能以取消引用的方式传递(即不能作为函数传递)。我不是很清楚,但看起来 foo
和 test
的实现是相同的。
我建议阅读 c++11 中的 std::function:
http://en.cppreference.com/w/cpp/utility/functional/function
这将允许您做更多您想做的事情,其中 void(int) 指的是 return 类型和您函数的参数列表:
void fizz( std::function<void(int)> f )
{
f(1);
}
函数现在是第一个 class 数据类型。您甚至可以将函数用于 class 方法,而无需任何痛苦的语法。在许多情况下,您还可以使用 auto 进行 lazy/dynamic 替换。您还可以使用相同的设置来做一些有趣的事情,比如异步启动函数。
auto used_to_call_fizz = fizz;
used_to_call_fizz( f );
std::async( used_to_call_fizz, f );
每个函数都有自己的地址,可以看成一个array
。函数 void fizz(int)
和 void print(int i)
有不同的内存地址,所以 fizz = print;
会出错。但是你使用void (*bar)(int);
,它显示了一个函数的指针,用于指向一个函数。当你使用bar=&print
时,它会初始化bar
指针,然后得到正确答案。顺便说一句,您可以使用 bar=print
,因为它们具有与 array
相同的内存地址。希望对您有所帮助。
给定一个打印函数:
void print(int i)
{
cout << i << endl;
}
为什么我们可以在 main 函数中这样做:
void (*bar)(int);
bar = &print;
但不是这个:
void fizz(int);
fizz = print;
但是当涉及到函数参数时,我们可以传递一个指向函数的指针或者函数的副本:
void foo(void (*f)(int))
{
(*f)(1);
}
void test(void f(int))
{
f(1);
}
有人知道这些差异的原因吗?
函数指针可以指向具有相同参数和return类型的任何函数。在你上面的代码中,"bar"是一个指针,bar=&print
意味着让bar
指向print
。但是,函数不能 =
函数。
函数指针的好处在于它可以指向任何函数,只要函数具有相同的参数和 return 类型即可。当一个函数指针作为另一个函数的参数时,这被证明是非常有用的。
当函数用作参数时,传递的实际内容是函数的地址。函数不能以取消引用的方式传递(即不能作为函数传递)。我不是很清楚,但看起来 foo
和 test
的实现是相同的。
我建议阅读 c++11 中的 std::function: http://en.cppreference.com/w/cpp/utility/functional/function
这将允许您做更多您想做的事情,其中 void(int) 指的是 return 类型和您函数的参数列表:
void fizz( std::function<void(int)> f )
{
f(1);
}
函数现在是第一个 class 数据类型。您甚至可以将函数用于 class 方法,而无需任何痛苦的语法。在许多情况下,您还可以使用 auto 进行 lazy/dynamic 替换。您还可以使用相同的设置来做一些有趣的事情,比如异步启动函数。
auto used_to_call_fizz = fizz;
used_to_call_fizz( f );
std::async( used_to_call_fizz, f );
每个函数都有自己的地址,可以看成一个array
。函数 void fizz(int)
和 void print(int i)
有不同的内存地址,所以 fizz = print;
会出错。但是你使用void (*bar)(int);
,它显示了一个函数的指针,用于指向一个函数。当你使用bar=&print
时,它会初始化bar
指针,然后得到正确答案。顺便说一句,您可以使用 bar=print
,因为它们具有与 array
相同的内存地址。希望对您有所帮助。