指针用于指向一些变量。类似地,函数指针是用于指向函数的指针。它基本上用于存储函数的地址。我们可以使用函数指针来调用函数,也可以将指针作为参数传递给另一个函数。
它们主要用于事件驱动的应用程序,回调,甚至用于将函数存储在数组中。
计算机仅理解低级语言,即二进制形式。我们用C++编写的程序始终使用高级语言,因此,使用编译器将程序转换为二进制形式。编译器是将源代码转换为可执行文件的程序。该可执行文件存储在RAM中。 CPU从main()方法开始执行,并读取RAM中的副本,但不读取原始文件。
所有函数和机器代码指令均为数据。此数据是一堆字节,所有这些字节在RAM中都有一些地址。函数指针包含函数的第一条指令的RAM地址。
以下是函数指针声明的语法:
链接:https://www.learnfk.comhttps://www.learnfk.com/c++/function-pointer-in-cpp.html
来源:LearnFk无涯教程网
int (*FuncPtr) (int,int);
上面的语法是函数声明。由于函数不像变量那样简单,但是C++是类型安全的,因此函数指针具有返回类型和参数列表。在上面的语法中,我们首先提供返回类型,然后提供指针的名称,即FuncPtr,它由方括号括起来,并在指针符号之前,即(*)。此后,我们提供了参数列表(int,int)。上面的函数指针可以指向带有两个整数参数并返回整数类型值的任何函数。
我们可以很容易地获得函数的地址。我们只需要提及函数的名称,就不需要调用函数。
让我们通过示例进行说明。
#include <iostream> using namespace std; int main() { std::cout << "Address of a main() function is : " <<&main<< std::endl; return 0; }
在上面的程序中,我们正在显示main()函数的地址。要打印main()函数的地址,我们刚刚提到了函数的名称,没有括号而不是参数。因此,函数名称本身没有任何括号或参数,表示函数的地址。
我们可以使用另一种方式来打印函数的地址,即&main。
我们可以在函数指针的帮助下通过简单地使用函数指针的名称来调用函数。通过函数指针调用函数的语法与我们通常调用函数的语法相似。
让我们通过示例了解这种情况。
#include <iostream> using namespace std; int add(int a , int b) { return a+b; } int main() { int (*funcptr)(int,int); //函数指针声明 funcptr=add;//funcptr 指向 add 函数 int sum=funcptr(5,5); std::cout << "value of sum is :" <<sum<< std::endl; return 0; }
在上面的程序中,我们声明了函数指针,即int(* funcptr)(int,int),然后将add()函数的地址存储在funcptr中。这意味着funcptr包含add()函数的地址。现在,我们可以使用funcptr调用add()函数。语句funcptr(5,5)调用add()函数,并且add()函数的结果存储在sum变量中。
输出:
让我们看一下函数指针的另一个示例。
#include <iostream> using namespace std; void printname(char *name) { std::cout << "Name is :" <<name<< std::endl; } int main() { char s[20]; //数组声明 void (*ptr)(char*); //函数指针声明 ptr=printname; //将 printname 的地址存储在 ptr 中。 std::cout << "Enter the name of the person: " << std::endl; cin>>s; cout<<s; ptr(s); //调用 printname() 函数 return 0; }
在上面的程序中,我们定义函数printname(),其中包含char指针作为参数。我们声明函数指针,即void(* ptr)(char *)。语句ptr = printname表示我们正在将printname()函数的地址分配给ptr。现在,我们可以使用语句ptr(s)调用printname()函数。
输出:
可以将函数指针作为参数传递给另一个函数。
通过示例让我们理解。
#include <iostream> using namespace std; void func1() { cout<<"func1 is called"; } void func2(void (*funcptr)()) { funcptr(); } int main() { func2(func1); return 0; }
在上面的代码中,func2()函数将函数指针作为参数。 main()方法调用func2()函数,在该函数中传递func1()的地址。这样,func2()函数将间接调用func1()。
输出:
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)