目录
一、函数指针变量
1、函数指针变量可以类比数组指针变量,可以得出函数指针变量是用来存放地址的,未来可以通过地址调用函数,通过下图可以看出函数有地址。
函数名就是函数的地址,可以通过&函数名的方式获得函数的地址。 (&函数名和函数名是一样的,都是函数地址,但是&数组名表示整个数组,取出的是整个数组的地址。数组名是数组首元素的地址。)
2、如果要将函数的地址存放起来,就得创建函数指针变量,x和y可写可不写。
函数指针变量的使用
二、函数指针数组
1、函数指针数组是把函数的地址存到一个数组中。
下面分辨一下:
int*p[10]----数组,p先和[ ]结合 存放指针的数组 int(*p)[10]---指针,*p在括号里面 指向数组的指针 int (*)( ) p[10]---p先和[10]结合,说明p是数组,数组的内容是int(*)( )类型的指针
2、函数指针数组的用途----转移表
用函数指针数组实现计算器
首先定义计算器的几种算法
转移表的实现
菜单界面
实现函数调用
3、完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0,add,sub,mul,div };
do
{
printf("********************\n");
printf("********1.add*******\n");
printf("********2.sub*******\n");
printf("********3.mul*******\n");
printf("********4.div*******\n");
printf("********0.exit******\n");
printf("********************\n");
printf("请选择: ");
scanf("%d", &input);
if ((input <= 4 && input >= 1))
{
printf("输入操作数: ");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
printf("ret=%d\n", ret);
}
else if (input == 0)
{
printf("退出计算器\n");
}
else
{
printf("输入有误\n");
}
} while (input);
return 0;
}