目录
一、函数指针
函数指针变量是用来存放函数地址的,通过地址能够调用函数。(即指向函数的指针)
函数地址:函数名、&函数名都表示函数的地址
函数指针类型的解析:
int ( * ) ( int x, int y) 函数指针变量的类型
函数指针变量的使用
#include<stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int (*p)(int, int) = add;
printf("%d\n", (*p)(2, 3));
printf("%d\n", p(2, 3));
return 0;
}
上述代码表明函数指针变量在调用时可省去 * 号
二、函数指针数组
把函数的地址存到一个数组中,那这个数组就叫函数指针数组。(即存放函数指针的数组)
格式:
int (*arr[3])();
说明:
arr先和 [ ] 结合,说明arr是数组,数组内容是 int (*) ( ) 类型的函数指针。
计算器的实现
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; } int main() { int input = 0; int x = 0, y = 0; int ret = 0; int (*arr[5])() = { 0,add,sub,mul,div }; do { printf("*******************\n"); printf("****** 0.quit *****\n"); printf("****** 1.add ******\n"); printf("****** 2.sub ******\n"); printf("****** 3.mul ******\n"); printf("****** 4.div ******\n"); printf("*******************\n"); printf("请输入:"); scanf("%d", &input); switch (input) { case 0: printf("计算器退出\n"); break; case 1: printf("请输入两个操作数:"); scanf("%d%d", &x, &y); ret = add(x, y); printf("%d\n", ret); break; case 2: printf("请输入两个操作数:"); scanf("%d%d", &x, &y); ret = sub(x, y); printf("%d\n", ret); break; case 3: printf("请输入两个操作数:"); scanf("%d%d", &x, &y); ret = mul(x, y); printf("%d\n", ret); break; case 4: printf("请输入两个操作数:"); scanf("%d%d", &x, &y); ret = div(x, y); printf("%d\n", ret); break; default: printf("输入错误,请重新输入\n"); } } while (input); return 0; }
可看出代码非常的冗余,switch语句中有大量的重复代码
2. 使用函数指针数组实现
#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; } int main() { int input = 0; int x = 0, y = 0; int ret = 0; int (*arr[5])() = { 0,add,sub,mul,div };//函数指针数组存入函数的地址 do { printf("*******************\n"); printf("****** 0.quit *****\n"); printf("****** 1.add ******\n"); printf("****** 2.sub ******\n"); printf("****** 3.mul ******\n"); printf("****** 4.div ******\n"); printf("*******************\n"); printf("请输入:"); scanf("%d", &input); if (input >= 1 && input <= 4) { printf("\n请输入两个操作数:"); scanf("%d%d", &x, &y); int ret = (*arr[input])(x, y); printf("%d\n", ret); } else if (input == 0) { printf("结束\n"); } else { printf("输入错误,请重新输入\n"); } } while (input); return 0; }
主函数部分就不再有冗余的出现,代码变得简洁。
完