c语言函数指针的定义和使用

            这里尝试写出了三种方法来定义函数指针,注意第三种直接可以得到指针变量(这里卡了我一下),对于函数指针,在当作参数来传递时,根据传入的函数名(函数地址即具体的函数执行入口)不同,会调用不同的函数,这点有点像c++多态虚函数重写,把函数指针和其他参数一起传入另一个函数,这里的性质有点类似于c++仿函数,而整个函数指针的存在又像是提供了某一类函数的框架,有点c++模板的感觉。这是我目前的一点感觉,虽然是几种不同的机制,但是现象上有一定的相似性。

函数指针.c

#include<stdio.h>

//函数指针

int myAdd(int num1, int num2)
{
	printf("myAdd()\n");
	return num1 + num2;
}

int mySub(int num1, int num2)
{
	printf("mySub()\n");
	return num1 - num2;
}

int myMutli(int num1, int num2)
{
	printf("myMulti()\n");
	return num1 * num2;
}

int myDiv(int num1,int num2)
{
	printf("myDiv()\n");
	return num1 / num2;
}

//第一种定义方法
typedef int (FUNCP1)(int, int);

//第二种定义方法
typedef int (*FUNCP2)(int, int);//注意定义成指针形式,*写在前面

int doFunc(FUNCP1 fp, int num1, int num2)
{
	return fp(num1, num2);
}

void test01()
{
	//函数名是一个函数的入口地址,也就是某一个函数的指针
	FUNCP1* fp1 = myAdd;//FUNCP1被定义成了一种类型名的类型,所以此处加*写成指针类型,然后定义指针变量指向函数名
	printf("第一种定义方法下的第一种使用方法: %d\n",fp1(10, 10));
	printf("第一种定义方法下的第二种使用方法: %d\n",(*fp1)(10, 20));
	printf("----------------------------------\n");

	FUNCP2 fp2 = myAdd;//FUNCP2本身就定义成了指针类型,此处可以直接来定义一个指针变量,然后定义指针变量指向函数名
	printf("第二种定义方法下的第一种使用方法: %d\n",fp2(30, 30));
	printf("第二种定义方法下的第二种使用方法: %d\n",(*fp2)(30, 50));
	printf("----------------------------------\n");

	//第三种定义方法
	int(*fp3)(int, int) = myAdd;//没有用到typedef,直接定义了一个指针变量,这里容易写错,容易搞成类型而非变量
	printf("第二种定义方法下的第一种使用方法: %d\n",fp3(50, 50));
	printf("第二种定义方法下的第二种使用方法: %d\n",(*fp3)(80, 50));
	printf("----------------------------------\n");
	
	system("pause");
	return 0;
}

void test02()
{
	//函数指针做参数可以实现类似多态的效果,有点模板的意思,将函数指针结合参数一起传递,又有点仿函数的意思
	int ret = doFunc(myAdd, 10, 10);
	printf("ret =%d\n", ret);
	printf("------------------------\n");

     ret = doFunc(mySub, 10, 10);
	printf("ret =%d\n", ret);
	printf("------------------------\n");

	ret = doFunc(myMutli, 10, 10);
	printf("ret =%d\n", ret);
	printf("------------------------\n");

	ret = doFunc(myDiv, 10, 10);
	printf("ret =%d\n", ret);
	printf("------------------------\n");
}

int main()
{
	//test01();
	test02();

	system("pause");
	return 0;
}




test01()测试结果:

 test02()测试结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值