函数指针与函数指针数组

函数指针在本质上就是指针,是用来指向函数地址的指针。所以以下两种写法哪一种可以用来保存函数地址。

void test()
{
    printf("dog\n");
}

   void (*p)() = test();
   void *p() = test();

答案是第一个 void(*p)()= test(),因为代码先运行括号中的*p使其相结合,所以p才是指针,指向一个 void 无返回值的函数,而第二种它是一个void * 类型函数,并不是函数指针。

如果这样使用函数指针,会有一种画蛇添足的感觉,那么在实际应用中它一般是如何应有的。

我们知道数组是用来存放相同类型的存储空间,就是指针数组是存放指针的数组。

例如:

    int *arr[10];

这就是存放十个int * 类型的数组。

那么如果我们吧函数的地址存放于数组当中,那么便成为了函数指针数组,虽然有点绕口,但函数指针数组的本质就是数组

函数指针数组的写法如下:

void m()
{
    ;
}
void n()
{
    ;
}
int main()
{
    int (*p[2])() = {m,n};
    return 0;
}

函数指针数组的用途:转移表

例子:计算机

#include<stdio.h>
void menu()
{
	printf("************************\n");
	printf("***  1.add   2.sub   ***\n");
	printf("***  3.mul   4.div   ***\n");
	printf("***      0.exit      ***\n");
	printf("************************\n");
	printf("************************\n");
}
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int a = 0;
	int b = 0;
	int input = 0;
	int ret = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("输入数据:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", add(a, b));
			break;
		case 2:
			printf("输入数据:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", sub(a, b));	
			break;
		case 3:
			printf("输入数据:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", mul(a, b));
			break;
		case 4:
			printf("输入数据:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", div(a, b));
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);

	return 0;
}

如果使用函数指针数组实现:

#include<stdio.h>
void menu()
{
	printf("************************\n");
	printf("***  1.add   2.sub   ***\n");
	printf("***  3.mul   4.div   ***\n");
	printf("***      0.exit      ***\n");
	printf("************************\n");
	printf("************************\n");
}
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int a, b;
	int (*p[5])(int a, int b) = {0,add,sub,mul,div};
	int input = 1;
	while (input)
	{
		menu();
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("输入数据:\n");
			scanf("%d %d", &a, &b);
			printf("%d\n", p[input](a, b));
		}
		else if (input == 0)
		{
			printf("退出程序\n");
			break;
		}
		else
		{
			printf("输入错误\n");
		}
	}
	return 0;
}

只有在返回类型和形参相同时,才可以使用函数指针数组。使用函数指针数组可以减少代码的冗余性,也方便后期的维护。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值