1.函数指针
为什么要使用函数指针?
在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。
获取函数的地址:只要使用函数的名字即可。例如:
void function(int a);
则function是该函数的地址。
首先声明函数的原型,然后用(*p)替代函数名,这样p就是这类函数的指针。例如:
“声明”函数原型(无须形参):
int number(int, int); // 声明的时候可以只写类型,但是定义的时候要写形参(若要用到形参)
“只有类型没有参数名的形参也叫哑元”
函数指针声明:
int (*p)(int, int); //函数指针变量是p;
2.如何使用函数指针调用函数?
double pam(int); //声明函数原型
double (*pa)(int); //声明指向上面函数原型的指针
pa = pam; //向函数指针赋值
double x = (*pa)(5); //使用pa调用函数pam,传递参数5,定义变量x接收函数返回值
C++中除了这样使用:double x = (*pa)(5);
也允许像函数名一样使用函数指针:double x = pa(5);
3. 使用函数指针调用函数实例
//实例:
#include <iostream>
using namespace std;
//声明函数原型,未加上形参
//void func_add(int, int);
//void func_sub(int, int);
//声明一个指向该类型的函数指针
void func_add(int num1, int num2){
int sum = 0;
sum = num1+num2;
cout<<"两个数之和"<<sum<<"\n"<<endl;
}
void func_sub(int num1, int num2){
int sub = 0;
sub = num1-num2;
cout<<"两个数之差"<<sub<<"\n"<<endl;
}
//函数指针调用
void func(void(*p)(int,int), int num1, int num2){
cout<<"函数指针调用"<<endl;
(*p)(num1,num2);
}
int main(void){
void (*p)(int, int);
p = func_add;
func(p,5,2);
p = func_sub;
func(p,5,2);
}
/*
void testFun(int, void *);
int main(int argc, char *argv[])
{
testFun;
return 0;
}
void testFun(int, void *)
{
cout << "We are now in testFun!" << endl;//编译通过,但是没有运行到这里是什么情况???
}
C++编译器会对函数名进行名字修饰(name mangling),名字修饰是函数名和参数类型的组合,
编译器以此来区分重载函数,所以在声明和定义函数的时候可以不需要形参(当然前提是你的函数体中没有利用到形参)。
以上代码之所以能通过编译,但没有运行,是因为编译器在对该段代码进行词法分析和语法分析的时候,
并没有发现错误,它符合文法规则,但在语义分析的时候编译器就发现testFun;
这句没有任何语义,就直接略去了,并不会为它生成中间代码,
*/
参考链接:https://blog.youkuaiyun.com/sunxiwang/article/details/78591557