C语言:理解函数指针数组和定义

  • 函数指针数组和定义

数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,比如:

     int *arr[10];//数组的每个元素是int*

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

  int (*parr1[10])();

分析:parrl先和[]结合,说明parr1是数组,数组的内容是什么呢?是int (*)() 类型的函数指针。

举例:

# include <stdio.h>
# include <stdlib.h>

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(*p[4])(int, int) = { Add,Sub,Mul,Div};
	int i = 0;
	for (i = 0; i < 4; i++)
	{
	printf("%d\n",p[i](8, 4));
	}
	system("pause");
		return 0;
}
  • 转移表 

一看到转移这两个字,就会想到和状态有关,实际中通常是用 if-else语句或者switch语句进行一些状态的切换,如果遇到比较复杂的情况,转移次数可能会达到数百次或者数千次,如果再使用if-else语句或者switch语句,维护起这个软件系统,工作量将会相当的大。这个时候就可以采用“转移表”来避免这种情况。

举例:计算器

# include <stdio.h>
# include <stdlib.h>

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 a, b;
	int input = 1;
	int ret = 0;
	int(*p[5])(int a, int b) = {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_s("%d", &input);
		if ((input<5 && input>0))
		{
			printf("输入操作数:>");
			scanf_s("%d %d", &a,&b);
			ret = (*p[input])(a, b);
		}
		else
		{
			printf("输入有误\n");
		}
			printf("ret=%d\n", ret);
	}
	system("pause");
		return 0;
}
  • 指向函数指针数组的指针 

指向函数指针数组的指针:指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针;

如何定义?

   void test(const char* str)
{
      printf("%s\n", str);    
}
 int main( )
{
      void (*pfun) (const char*) = test;//函数指针pfun

      void (*pfunArr[51)(const char* str); pfunArr[0] = test;//函数指针的数组pfunArr

      void (*(*ppfunArr)[10])(const char*) = &pfunArr;return 0;   //.指向函数指针数组pfunArr的指针ppfunArr.

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/81807131