一、用函数指针变量调用函数
一个函数在编译的时候,系统会给这个函数分配一个入口地址,这个入口地址就称为函数的地址(指针)。既然有地址,就可以定义一个指针变量来指向该函数,然后就可以通过指针变量调用该函数。
命名方式:数据类型标识符 (指针变量名) (形参列表)
传统函数举例:
int max (int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int c;
c = max(5,19);
cout << c << endl; //输出19
}
将函数改造成函数指针形式
int (*p)(int x,int y);
p = max;//将函数max的入口地址赋给指针变量p(函数名代表函数的入口地址)
//p = &max; // 上条语句还可以写成这样
int c= (*p)(5,19);//将原来的max替换为(*p),调用*p,就是调用函数max。
//int c = p(5,19);//上条语句还可以写成
二、把指向函数的指针变量作为函数参数
举例:
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int wmax (int a,int b,int(*func)(int c,int d))
{
int result = func(a,b);
return result;
}
int main()
{
int c;
c = wmax(5,19,max);
cout << c << endl;//输出19
int (*p)(int,int);
p = max;
c = wmax(23,34,p);//输出34
}
三、返回指针的函数
一般定义形式:
数据类型 * 函数名 (参数列表)
错误用法举例:
int *add(int x,int y)
{
int sum = x+y;
return ∑//此处隐藏一个致命问题,add函数执行完,sum的内存会被系统回收。
}
int main()
{
int *presult;
presult = add(4,5);//执行add后,presult的内存已经不归开发者所有,开发者不应该从中取值或赋值。
cout << *presult << endl;
}
如何改造该程序?可以将sum定义成一个全局变量。