一:函数指针变量
函数指针变量是存放函数地址的指针。通过函数地址可以调用函数,
//函数指针变量 #include <stdio.h> int Add(int x, int y) { return x + y; } int main() { int (*p)(int, int) = &Add;//p是函数指针变量 int ret = p(2, 4);//通过地址调用Add函数 printf("%d ", ret); return 0; }
二:函数指针数组:
函数指针数组存放的是若干个函数的地址,这些函数的参数相同,返回类型也相同。
//函数指针数组 #include <stdio.h> int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int main() { int(*parr[2]) = { add,sub };//函数指针数组parr[],存放的是add,sub,函数的地址 //add,sub函数参数都是int,int类型,返回类型也是int类型 return 0; }
三:函数指针数组的使用
1计算器的实现:一般方法
//转移表的一般方法 #include <stdio.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; } 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; do { int a = 0; int b = 0; int ret = 0; menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret = add(a, b); printf("%d\n", ret); break; case 2: printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret = sub(a, b); printf("%d\n", ret); break; case 3: printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret = mul(a, b); printf("%d\n", ret); break; case 4: printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret =div(a, b); printf("%d\n", ret); break; case 0: printf("退出计算\n"); break; default: printf("输入错误,重新输入\n"); break; } } while (input); return 0; }
一般方法有太多相似的代码,会显得特别冗余,让我们看一下用函数指针数组的方法。
2:计算器的实现:函数指针数组
#include <stdio.h> void menu() { printf("*************************\n"); printf("***1 add 2 sub*********\n"); printf("***3 mul 4 div*********\n"); printf("***0 exit ***********\n"); printf("*************************\n"); } 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 = 0; int b = 0; int input = 0; int ret = 0; int (*p[])(int, int) = { 0,add,sub,mul,div }; do { menu(); printf("请选择:"); scanf("%d", &input); if (input >= 1 && input <= 4) { printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret = p[input](a,b);//通过下标访问数组中的元素 printf("%d\n", ret); } else if (input == 0) { printf("退出计算\n"); } else printf("选择错误,重新选择\n"); } while (input); return 0; }