C++ 函数指针基础教程文档

收录于 2023-04-20 00:10:05 · بالعربية · English · Español · हिंदीName · 日本語 · Русский язык · 中文繁體

众所周知,指针用于指向某些变量;类似地,函数指针是用于指向函数的指针。它基本上用于存储函数的地址。我们可以使用函数指针来调用函数,也可以将指针作为参数传递给另一个函数。
它们主要用于事件驱动的应用程序,回调甚至用于存储函数

函数的地址是什么?

C++中的函数指针
计算机仅理解低级语言,即二进制形式。我们用C++编写的程序始终使用高级语言,因此,使用编译器将程序转换为二进制形式。编译器是将源代码转换为可执行文件的程序。该可执行文件存储在RAM中。 CPU从main()方法开始执行,并读取RAM中的副本,但不读取原始文件。
所有功能和机器代码指令均为数据。此数据是一堆字节,所有这些字节在RAM中都有一些地址。函数指针包含函数第一条指令的RAM地址。

声明语法

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

函数的地址

我们可以获取a的地址功能非常容易。我们只需要提及函数的名称,就不需要调用函数。
让我们通过示例进行说明。
#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变量中。
输出:
C++中的函数指针
让我们看一下函数指针的另一个示例。
#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(),其中包含char指针作为参数。我们声明函数指针,即void(* ptr)(char *)。语句ptr = printname表示我们正在将printname()函数的地址分配给ptr。现在,我们可以使用语句ptr(s)调用printname()函数。
输出:
C++中的函数指针

将函数指针作为参数传递

函数指针可以作为
让我们通过一个示例来理解。
#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++中的函数指针