C++ 函数指针
我们知道指针被用来指向变量,类似地,函数指针是用来指向函数的指针。它基本上用于存储函数的地址。我们可以使用函数指针来调用函数,也可以将指针作为参数传递给另一个函数。
它们主要用于事件驱动的应用程序、回调函数甚至在数组中存储函数时非常有用。
什么是函数的地址
计算机只能理解低级语言,即二进制形式。我们用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()的函数,它包含一个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()函数。
输出: