函数指针

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]));
    }
}

全部评论

相关推荐

02-28 01:18
已编辑
南昌大学 后端工程师
黑皮白袜臭脚体育生:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务