-
函数指针数组和定义
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,比如:
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.