数组是存放相同数据类型元素的存储空间,指针是存放数据元素的地址的。
那我们要把很多函数的地址放入一个数组,该如何定义呢?
int (*p[10])(int x, int y)={0};
p先和[]结合是数组,数组的内容是int (*)()的函数指针。
具体应用:
先展示普通计算器:
#include<stdio.h>
#include<math.h>
void menu()
{
printf("******************************************\n");
printf("**** 1.加法 2.减法 3.乘法 4.除法 ****\n");
printf("**** 5.平方 6.立方 7.开方 0.退出 ****\n");
printf("******************************************\n\n");
}
float JiaFa(float x, float y)
{
return x + y;
}
float JianFa(float x, float y)
{
return x - y;
}
float ChengFa(float x, float y)
{
return x * y;
}
float ChuFa(float x, float y)
{
return x / y;
}
float PingFang(float x)
{
return x * x;
}
float LiFang(float x)
{
return x * x * x;
}
float KaiFang(float x)
{
return sqrt(x);
}
void JiSuanQi()
{
menu();
int input = 0;
float num1 = 0;
float num2 = 0;
float ret = 0;
do
{
printf("请选择运算方式:>");
scanf_s("%d", &input);
switch (input)
{
case 1:
//加法
printf("输入数字:>");
scanf_s("%f%f", &num1, &num2);
ret=JiaFa(num1, num2);
printf("%2f\n", ret);
break;
case 2:
//减法
printf("输入数字:>");
scanf_s("%f%f", &num1, &num2);
ret=JianFa(num1, num2);
printf("%2f\n", ret);
break;
case 3:
//乘法
printf("输入数字:>");
scanf_s("%f%f", &num1, &num2);
ret=ChengFa(num1, num2);
printf("%2f\n", ret);
break;
case 4:
//除法
printf("输入数字:>");
scanf_s("%f%f", &num1, &num2);
ret=ChuFa(num1, num2);
printf("%2f\n", ret);
break;
case 5:
//平方
printf("输入数字:>");
scanf_s("%f", &num1);
ret = PingFang(num1);
printf("%2f\n", ret);
break;
case 6:
//立方
printf("输入数字:>");
scanf_s("%f", &num1);
ret = LiFang(num1);
printf("%2f\n", ret);
break;
case 7:
//开方
printf("输入数字:>");
scanf_s("%f", &num1);
ret = KaiFang(num1);
printf("%2f\n", ret);
break;
case 0:
//退出
printf("退出计算器\n");
break;
default:
printf("输入错误,重新输入\n");
break;
}
} while (input);
}
int main()
{
JiSuanQi();
return 0;
}
展示利用函数指针数组写的计算器:
#include<stdio.h>
#include<math.h>
void menu()
{
printf("******************************************\n");
printf("**** 1.加法 2.减法 3.乘法 4.除法 ****\n");
printf("**** 5.平方 6.立方 7.开方 0.退出 ****\n");
printf("******************************************\n\n");
}
float JiaFa(float x, float y)
{
return x + y;
}
float JianFa(float x, float y)
{
return x - y;
}
float ChengFa(float x, float y)
{
return x * y;
}
float ChuFa(float x, float y)
{
return x / y;
}
float PingFang(float x)
{
return x * x;
}
float LiFang(float x)
{
return x * x * x;
}
float KaiFang(float x)
{
return sqrt(x);
}
void JiSuanQi()
{
menu();
int input = 0;
float num1 = 0;
float num2 = 0;
float ret = 0;
float(*HanShu_1[5])(float x, float y) = { 0, JiaFa, JianFa, ChengFa, ChuFa };
float(*HanShu_2[8])(float x) = { 0,0,0,0,0,PingFang, LiFang, KaiFang };
do
{
printf("请选择运算方式:>");
scanf_s("%d", &input);
if (input >= 1 && input <= 4)
{
printf("输入数字:>");
scanf_s("%f%f", &num1, &num2);
ret = (*HanShu_1[input])(num1, num2);
printf("%f\n", ret);
}
else if (input >= 5 && input <= 7)
{
printf("输入数字:>");
scanf_s("%f", &num1);
ret = (*HanShu_2[input])(num1);
printf("%f\n", ret);
}
else if (input == 0)
{
break;
}
else
printf("输入错误。重新输入\n");
} while (input);
}
int main()
{
JiSuanQi();
return 0;
}
学习更多的知识,就是为了优化代码。
来源:CSDN
作者:Listen-Y
链接:https://blog.csdn.net/Shangxingya/article/details/104318138