函数指针和函数指针数组


一、函数指针

数据在内存中都有自己的地址,地址需要指针变量来保存,我们常见的指针有char* 、int* 、double*、float*。

函数也有自己的地址,保存函数的地址的变量就是函数指针。但函数指针的形式较为复杂,下面举几个例子来说明函数指针的形式。

void (* pfun1)();

pfun1 先和 * 结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。

int(* pfun2)(int, int);

pfun2先和 * 结合,说明pfun2是指针,指针指向的是一个函数,指向的函数参数为int、int,返回值为int。

double(* pfun3)(int, char);

pfun3先和 * 结合,说明pfun3是指针,指针指向的是一个函数,指向的函数参数为int、char,返回值为double。

二、函数指针数组

数组是用来存放多个相同类型变量的

int a[10];//数组有10个元素,每个元素类型为int
char ch[5];//数组有5个元素,每个元素类型为char
double d[20];//数组有20个元素,每个元素类型为double

同理,函数指针数组就是存放多个函数指针的数组,但它的形式较为复杂。

int (*parr1[10])(int, int);
//含有10个元素的数组,每个元素为函数指针
//且函数指针指向的函数参数为int、int,返回值为int。

double (*parr2[5])(int, char);
//含有5个元素的数组,每个元素为函数指针
//且函数指针指向的函数参数为int、char,返回值为double。

三、应用:两个数的加减乘除运算

将加减乘除分别封装成四个函数,在main函数中调用。

int ADD(int x, int y)
{
	return x + y;
}
int SUB(int x, int y)
{
	return x - y;
}
int MUL(int x, int y)
{
	return x * y;
}
int DIV(int x, int y)
{
	return x / y;
}
int main()
{
	int x, y, input, ret;
	int(*pfArr[])(int, int) = { 0, ADD,SUB, MUL, DIV };
	//0只是为了下面调用函数是方便,不放也可以
	//函数指针数组,内部的四个函数指针指向的函数类型相同,
	//参数为int、int,返回值为int。
	do
	{
		printf("0.退出\n1.加\n2.减\n3.乘\n4.除\n");
		scanf("%d", &input);
		if (0 == input)
		{
			printf("退出\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个数");
			scanf("%d%d", &x, &y);
			printf("%d\n", (pfArr[input](x, y)));
			//如(pfArr[1](1, 2))就是调用数组下标为1的元素,
			//在这里是调用ADD函数,并用1和2进行运算
			//即对1和2进行加法运算
		}
		else
		{
			printf("输入错误,重新输入\n");
		}
	} while (input);
}

感谢阅读,如有错误请批评指正

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值