函数指针和常规调用的区别
Difference in Function Pointers and regular calling
我们有一项家庭作业,现在已经结束了,教授给了我们解决方案。问题只是出现了一种情况,我们可以使用函数指针和代码
他的例子是:
#include <iostream>
using namespace std;
int dvalue(int x)
{
return x*x;
}
int tvalue(int x)
{
return x*x*x;
}
void printValue(int (*fptr)(int), int x)
{
cout << fptr(x) << endl;
}
int main()
{
int (*pfnc)(int);
int value = 10;
pfnc = dvalue;
printValue(pfnc, 10);
}
我的问题是,这和做这件事是一样的吗:
int main()
{
cout << devalue(10) << endl;
}
我们为什么要使用它们?他们用的内存少吗?这只是为了让我们可以对一个参数或另一个函数调用多个函数以使其更简单吗?它们似乎更复杂,至少对于一个刚开始的程序员来说是这样。
我的问题是,这和做这件事是一样的吗:[…]
简而言之,是的。
我们为什么要使用它们?
事实上,我们并不经常使用它们,尤其是在C++中。我们确实在C.中更频繁地使用它们
尽管如此,理解函数指针还是很有用的。一些经典用途的例子有:
- 告诉
qsort()
如何比较数组元素 - 指定启动新线程时要运行的函数
为什么要使用函数指针?
有几种情况下指向函数的指针可以使用。一最常见的情况是编写函数执行任务(例如对数组进行排序),但您希望用户能够定义如何执行该任务的特定部分(例如数组是升序还是降序订单)。让我们仔细看看这个问题的应用情况特别是排序,作为一个可以推广到其他类似问题。
所有的排序算法都有一个相似的概念:排序算法遍历一堆数字,对它们进行比较的结果,并根据这些结果重新排序比较。因此,通过改变比较(可以是函数),我们可以在不影响其余的排序代码。
尽管它经常用于排序,但它还有其他用途,例如从数据库等资源加载时允许回调。
更简洁地说,您可以通过简单地指向以前定义的函数,当然也可以调用它们,动态地引用它们
参考文献:
http://www.learncpp.com/cpp-tutorial/78-function-pointers/
相关文章:
- 返回递归调用和仅递归调用的区别
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 运算符++();调用和++(*this)有什么区别?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- C++:调用运算符和调用其实现之间有区别吗
- 函数调用中的结构节点* 和节点* 有什么区别?
- 静态模板类成员函数的这两个调用之间有什么区别?
- 使用委托调用构造函数和在另一个构造函数体中调用的区别
- 显式运算符 = 调用和 = 运算符之间是否有区别
- 虚拟和非虚拟成员函数的调用方式有什么区别?
- 通过命名成员调用虚拟与地址或引用的区别
- 这些不同的方式在“ this”上调用操作员有什么区别
- 系统堆栈中的两个函数的递归调用(将不同数量的数组作为参数传递)有什么区别
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 通过直接连接或排队连接调用插槽的QTimer超时插槽之间的区别
- 通过函数指针调用函数 - 是否取消引用指针?有什么区别?
- 调用 .mutable_mynestedmsg() 和 .mynestedmsg() 之间有什么区别吗?