函数指针和函数指针数组

#include
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int x, y;
	scanf("%d %d", &x, &y);
	int (*p)(int,int) = add;//函数声明
	int ret = p(x, y);//函数调用
	printf("%d", ret);
}

函数指针:指向函数的指针

函数声明:(*P)表明这是一个指针,前面的Int是函数的返回类型,(int,int )是参数类型。是否对函数add取地址&是都可以。

函数调用:对于指针p是否解引用*都可以,指针后面跟上参数类型(int,int).

下面举2个例子(来自c语言缺陷和陷阱)

void(*(signal(int ,void(*)(int)))(int)

首先signal和后面的括号结合,所以signal是函数名(int,void(*)(int))就是函数参数,分别是int,和函数指针void(*)(int).最后去掉函数名和函数参数就是void(*)(int)就是返回类型。

显然这是一个函数声明,可是我们写代码时,不能写的这么复杂。

优化如下:

typedef void(*pf)(int) pf要写在中间,重新命名为pf.

就可以写成这样pf(*signal)(int,void(*)(int))。

下面一个例子是函数调用的 (* (void(*)()) 0) ()

首先void(*)()是一个函数指针,后面的0被强制转化为函数指针,后面的()表明无参数。

只有函数指针是不好使用的,大部分要配上函数指针数组。

例如int(*p[4])(int,int)={add,sub,mul,div};

p先与[]结合意味着是数组,去掉p[4],int(*)(int,int)就是函数指针了;后面就是取地址操作。

#include
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;
}
void menu()
{
	printf("**************************\n");
	printf("****  1.add   2.sub   ****\n");
	printf("****  3.mul   4.div   ****\n");
	printf("****  0.exit          ****\n");
	printf("**************************\n");
}
int main()
{
	int input = 0;
	int x = 0, y = 0, ret = 0;
	int (*p[])(int, int) = {0,Add,Sub,Mul,Div };
	do
	{
		menu();
		printf("请选择\n");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出\n");
			break;
		}
		else if (input > 0 && input <= 4)
		{
			printf("请输入两个数\n");
			scanf("%d %d", &x, &y);
			ret = p[input](x, y);
			printf("%d\n", ret);
		}
		else
		{
			printf("选择错误\n");
			break;
		}
	} while (input);
}

这是一个计算器的设计,就避免了switch语句重复写相同的语句,避免了程序的臃肿。

你可能感兴趣的:(c语言,蓝桥杯,c++)