📜  C++中的函数指针

📅  最后修改于: 2020-10-16 06:46:38             🧑  作者: Mango

C++中的函数指针

众所周知,指针用于指向一些变量。类似地,函数指针是用于指向函数的指针。它基本上用于存储函数的地址。我们可以使用函数指针来调用函数,也可以将指针作为参数传递给另一个函数。

它们主要用于事件驱动的应用程序,回调,甚至用于将函数存储在数组中。

函数的地址是什么?

计算机仅理解低级语言,即二进制形式。我们用C++编写的程序始终使用高级语言,因此,使用编译器将程序转换为二进制形式。编译器是将源代码转换为可执行文件的程序。该可执行文件存储在RAM中。 CPU从main()方法开始执行,并读取RAM中的副本,但不读取原始文件。

所有功能和机器代码指令均为数据。此数据是一堆字节,所有这些字节在RAM中都有一些地址。函数指针包含一个函数的第一个指令的RAM地址。

声明语法

以下是函数指针声明的语法:

int (*FuncPtr) (int,int);

上面的语法是函数声明。由于函数不像变量那样简单,但是C++是类型安全的,因此函数指针具有返回类型和参数列表。在上面的语法中,我们首先提供返回类型,然后提供指针的名称,即FuncPtr,该函数由方括号括起来,并在指针符号之前,即(*)。此后,我们提供了参数列表(int,int)。上面的函数指针可以指向带有两个整数参数并返回整数类型值的任何函数。

函数地址

我们可以很容易地获得函数的地址。我们只需要提及函数的名称,就不需要调用函数。

让我们通过一个例子来说明。

#include 
using namespace std;
int main()
{
  std::cout << "Address of a main() function is : " <<&main<< std::endl;
  return 0;
}

在上面的程序中,我们正在显示main()函数的地址。要printmain()函数的地址,我们刚刚提到了函数的名称,没有括号而不是参数。因此,函数名称本身不带方括号或参数就表示函数的地址。

我们可以使用另一种方式来print函数的地址,即&main。

间接调用函数

我们可以在函数指针的帮助下通过简单地使用函数指针的名称来函数。因为我们做的函数的调用通常是通过函数指针调用函数的语法是相似的。

让我们通过一个例子来了解这种情况。

#include 
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 :" <

在上面的程序中,我们声明了函数指针,即int(* funcptr)(int,int),然后将add()函数的地址存储在funcptr中。这意味着funcptr包含add()函数的地址。现在,我们可以使用funcptr调用add()函数。声明funcptr(5,5)调用add()函数,以及add()函数的结果被存储在总和变量。

输出:

让我们看一下函数指针的另一个示例。

#include 
using namespace std;
void printname(char *name)
{
    std::cout << "Name is :" <>s;
    cout<

在上面的程序中,我们定义函数printname(),其中包含char指针作为参数。我们声明函数指针,即void(* ptr)(char *)。语句ptr = printname表示我们正在将printname()函数的地址分配给ptr。现在,我们可以使用语句ptr(s)调用printname()函数。

输出:

将函数指针作为参数传递

函数指针可以作为参数传递给另一个函数。

让我们通过一个例子来理解。

#include 
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()。

输出: