我们知道指针是用来指向一些变量的;类似地,函数指针是用于指向函数的指针。它本质上用于存储函数的地址。我们可以通过使用函数指针来调用函数,也可以将指针作为参数传递给另一个函数。
它们主要用于 event-driven 应用程序、回调,甚至用于将函数存储在数组中。
函数的地址是什么?
计算机只理解低级语言,即二进制形式。我们用 C++ 编写的程序总是用高级语言编写的,所以为了将程序转换成二进制形式,我们使用编译器。编译器是将源代码转换为可执行文件的程序。此可执行文件存储在 RAM 中。 CPU 从 main() 方法开始执行,它读取 RAM 中的副本而不是原始文件。
所有的函数和机器码指令都是数据。这个数据是一堆字节,所有这些字节在 RAM 中都有一些地址。函数指针包含函数第一条指令的 RAM 地址。
声明的语法
以下是函数指针声明的语法:
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); // function pointer declaration
funcptr=add; // funcptr is pointing to the add function
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]; // array declaration
void (*ptr)(char*); // function pointer declaration
ptr=printname; // storing the address of printname in ptr.
std::cout << "Enter the name of the person:" << std::endl;
cin>>s;
cout<<s;
ptr(s); // calling printname() function
return 0;
}
在上面的程序中,我们定义了函数 printname(),它包含字符指针作为参数。我们声明函数指针,即 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()。
输出:
相关用法
- C++ Function Overloading用法及代码示例
- C++ 函数用法及代码示例
- C++ unordered_map cbegin用法及代码示例
- C++ map lower_bound()用法及代码示例
- C++ list assign()用法及代码示例
- C++ std::max()用法及代码示例
- C++ std::string::push_back()用法及代码示例
- C++ multimap key_comp()用法及代码示例
- C++ Deque erase()用法及代码示例
- C++ std::less_equal用法及代码示例
- C++ set rbegin()用法及代码示例
- C++ llround()用法及代码示例
- C++ getline(string)用法及代码示例
- C++ boost::algorithm::all_of()用法及代码示例
- C++ string::length()用法及代码示例
- C++ log2()用法及代码示例
- C++ lrint() and llrint()用法及代码示例
- C++ bitset all()用法及代码示例
- C++ set upper_bound()用法及代码示例
- C++ CHAR_MIN用法及代码示例
注:本文由纯净天空筛选整理自 Function Pointer in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。