函数指针
1.函数的本质
函数的本质是地址,证明如下
#include <iostream>
using namespace std;
int add(int a,int b)
{
return a+b;
}
int main()
{
printf("%d\n",add(3,6)); //正常调用add函数
printf("%p %d",add,add); //没有写参数,单独输出数组名
return 0;
}
2.定义及使用
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
int main()
{
//指针 现有类型
int* p1;
double* p2;
int(*p3)[5];
int(*p4)[3][5];
void* p5;
//以此类推,函数指针(指向函数的指针变量)
//数组特征 数组名用(*)代替
//int (*) (int int)定义函数指针
int (*p_add1)(int a, int b);
int (*p_add2)(int a, int b);
p_add1 = add;//为p_add1赋值
p_add2 = &add;//为p_add2赋值
p_add1 = add; //为p_add1赋值,此时add就是一个地址,赋给p_add
printf("%d\n", p_add1(10, 20));
//调用函数
p_add2 = &add;//为p_add2赋值,此时已取add地址
printf("%d\n", (*p_add2)(10, 20));//显式方式,找到地址,得到空间
}
3.实际应用
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double (*pmath)(double a);
pmath = sqrt;
printf("%f ", pmath(4)); //开平方根
pmath = fabs;
printf("%f ", pmath(-2)); //取绝对值
pmath = ceil;
printf("%f ", pmath(1.11)); //向上取整
pmath = floor;
printf("%f ", pmath(2.99)); //向下取整
}
如上例:不如把参数变成一个数组,指针变成一个函数指针数组
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double px[] = { 4,-2,1.11, 2.99 };
double(*pmath[])(double) = { sqrt,fabs,ceil,floor };
for (int i = 0; i < 4; i++)
{
printf("%f ", pmath[i](px[i]));
}
}
查看21道真题和解析

