函数指针、函数指针数组、函数指针的数组的指针的概念及其应用

时间:2021-03-04 18:57:32

·函数指针

首先让我们看一段代码:

int Add(int x,int y)
{
	return x+y;
}

int main()
{
	printf("%p\n",Add);
	printf("%p\n",&Add);
	return 0;
}

·这是结果:

函数指针、函数指针数组、函数指针的数组的指针的概念及其应用

·这是我们Add函数的地址,我们给出函数的指针变量用来存放某一函数的地址。

int (*p)(int ,int)
·定义p为一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。 注:如果写成*p(int,int),那么*则是对函数的返回值进行解引用。

·函数指针数组

·数组是⼀个存放相同类型数据的存储空间,那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

int (*parr1[10]])();

·parr1先和[ ]结合,说明parr1这是一个数组,数组的内容为int(*)( )类型的函数指针。

·那么函数指针数组有什么用呢?我们那下面的转移表进行举例。

·代码如下图所示:

#include <stdio.h>
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 x, y;
	int input = 1;
	int ret = 0;
	while (input)
	{
		printf( "*************************\n" );
		printf( " 1:add 2:sub \n" );
		printf( " 3:mul 4:div \n" );
		printf( "*************************\n" );
		printf( "请选择:" );
		scanf( "%d", &input);
		switch (input)
		{
			case 1:
				printf( "输⼊操作数:" );
				scanf( "%d %d", &x, &y);
				ret = add(x, y);
				break;
			case 2:
				printf( "输⼊操作数:" );
				scanf( "%d %d", &x, &y);
				ret = sub(x, y);
				break;
			case 3:
				printf( "输⼊操作数:" );
				scanf( "%d %d", &x, &y);
				ret = mul(x, y);
				break;
			case 4:
				printf( "输⼊操作数:" );
				scanf( "%d %d", &x, &y);
				ret = div(x, y);
				break;
			default:
				printf( "选择错误\n" );
				break;
		}
		printf( "ret = %d\n", ret);
	}
	return 0;
}

·这是我用switch调用函数实现的一个计算器,那么如果用函数指针数组应该如何实现呢?

int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
	while (input)
	{
		printf( "*************************\n" );
		printf( " 1:add 2:sub \n" );
		printf( " 3:mul 4:div \n" );
		printf( "*************************\n" );
		printf( "请选择:" );
		scanf( "%d", &input);
		if ((input < 4 && input > 1))
		{
			printf( "输⼊操作数:" );
			scanf( "%d %d", &x, &y);
			ret = (*p[input])(x, y);
		}
		else
			printf( "输⼊有误\n" );
		printf( "ret = %d\n", ret);
	}
	return 0;
}
·我们给出了main函数的写法,我们将每个函数存放在这个数组当中,定义一个函数指针数组,通过输入input来选择所需要的函数,这样的写法是否比上面的更加优化而且简单了呢?

·函数指针的数组的指针

·指向函数指针数组的指针是⼀个指针。

·指针指向⼀个数组 ,数组的元素都是函数指针。

void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	//函数指针pfun
	void (*pfun)(const char*) = test;
	//函数指针的数组pfunArr
	void (*pfunArr[5])(const char* str);
	pfunArr[0] = test;
	//指向函数指针数组pfunArr的指针ppfunArr
	void (*(*ppfunArr)[10])(const char*) = &pfunArr;
	return 0;
}
·如上图所示,这就是函数指针的数组的指针的定义。