1. 函数地址的定义和概念
函数地址是指函数在内存中存储的地址。在C和C++语言中,函数也是一种数据类型,和变量一样,函数也有自己的存储地址。
我们可以通过取地址符(&)获取函数的地址,将其存储在指针变量中,然后再通过该指针变量来调用函数。
2. 函数指针的定义和使用
2.1 函数指针的定义
函数指针是指向函数的指针变量,它可以指向特定的函数。函数指针的定义方式如下:
返回值类型 (*指针变量名)(函数参数列表)
例如,我们定义一个函数指针变量pf,它指向一个返回值为int类型,参数为两个int类型的函数:
int (*pf)(int, int);
函数指针变量pf在声明中必须用括号括起来,否则会被解释为返回类型是指向函数指针的指针。
2.2 函数指针的使用
通过函数指针,我们可以动态地选择要调用哪个函数。
我们可以将函数指针作为参数传递给另一个函数,也可以将函数指针作为返回值返回给调用者。下面是一个例子:
#include
using namespace std;
//函数指针作为参数
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int calculate(int (*operation)(int, int), int a, int b)
{
return (*operation)(a, b);
}
int main()
{
int a = 5, b = 3;
int result;
//将add函数的地址传给calculate函数
result = calculate(add, a, b);
cout << "a + b = " << result << endl;
//将sub函数的地址传给calculate函数
result = calculate(sub, a, b);
cout << "a - b = " << result << endl;
return 0;
}
在上面的例子中,calculate函数的第一个参数是一个函数指针,该函数指针指向一个具有两个int类型参数和int类型返回值的函数。我们将add函数的地址和sub函数的地址分别传给calculate函数,然后计算a+b和a-b的值。
3. 函数名和函数指针的区别
在C和C++语言中,函数名是函数的地址,因此我们可以直接将函数名作为参数传递给另一个函数。
然而,函数名和函数指针并不完全等同。函数名代表函数的地址,但它不能进行运算或者赋值;而函数指针可以进行运算和赋值。
下面是一个例子:
#include
using namespace std;
int add(int a, int b)
{
return a + b;
}
int main()
{
int (*pf)(int, int); //定义函数指针变量pf
pf = add; //将add函数的地址赋值给pf
int result = (*pf)(2, 3); //通过pf调用add函数
cout << "result = " << result << endl;
return 0;
}
在上面的代码中,我们将add函数的地址赋值给指针变量pf,并通过指针变量pf来调用add函数。
4. 函数指针数组
函数指针数组是由函数指针作为元素组成的数组,用于存储同样类型的函数指针。下面是一个例子:
#include
using namespace std;
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int main()
{
int (*pf[2])(int, int); //定义函数指针数组pf,包含两个元素
pf[0] = add;
pf[1] = sub;
int result1 = (*pf[0])(2, 3);
cout << "result1 = " << result1 << endl;
int result2 = (*pf[1])(2, 3);
cout << "result2 = " << result2 << endl;
return 0;
}
在上面的代码中,我们定义了一个函数指针数组pf,包含两个元素。第一个元素指向add函数,第二个元素指向sub函数。然后通过函数指针数组调用add函数和sub函数。
5. 总结
函数是一种数据类型,它和变量一样有自己的存储地址。函数指针是指向函数的指针变量,用于存储函数的地址。通过函数指针,我们可以动态地选择要调用哪个函数。函数指针可以作为参数传递给另一个函数,也可以作为返回值返回给调用者。函数名和函数指针虽然代表同一个地址,但是它们并不完全等同。函数指针数组是由函数指针作为元素组成的数组,用于存储同样类型的函数指针