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