# 函数指针、函数指针数组、计算器+转移表等归纳总结

### 🔥🔥函数指针：指向函数的指针变量

🚵我们知道，数组名就是数组的首元素的地址，这样数组和指针就有了联系

&函数名

🚵书写格式

int arr[5]={0};

int (*p)[5]=&arr;

int ret=(*pf)(2,3);

🚵来看一个函数指针的简单代码，

#include <stdio.h>
{
return x + y;
}
void calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
int ret = (*pf)(x, y);
printf("%d\n", ret);
}
int main()
{
return 0;
}

### 🔥🔥函数指针数组：存放函数指针的数组

int (*parr1[10])( );

### 🔥🔥🔥计算器 / 转移表

①普通的写法：

👇👇

#include <stdio.h>
{
printf("***************************\n");
printf("***************************\n");
printf("******    0.leave    ******\n");
printf("******    2.Sub      ******\n");
printf("******    3.Mul      ******\n");
printf("******    4.Div      ******\n");
printf("***************************\n");
printf("***************************\n");
}
{
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 a = 0;
int b = 0;
int c = 0;
do
{
printf("请选择：");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出\n");
break;
case 1:
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
printf("%d\n", c);
break;
case 2:
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
c = Sub(a, b);
printf("%d\n", c);
break;
case 3:
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
c = Mul(a, b);
printf("%d\n", c);
break;
case 4:
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
c = Div(a, b);
printf("%d\n", c);
break;
default:
printf("输入错误，重新输入\n");
}
} while (input);
return 0;
}

②用函数指针的写法：

👇👇

#include <stdio.h>
{
printf("***************************\n");
printf("***************************\n");
printf("******    0.leave    ******\n");
printf("******    2.Sub      ******\n");
printf("******    3.Mul      ******\n");
printf("******    4.Div      ******\n");
printf("***************************\n");
printf("***************************\n");
}
{
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 calc(int (*pf)(int, int))
{
int a = 0;
int b = 0;
int c = 0;
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
c = (*pf)(a, b);
//c=pf(a,b);这种格式也可以
printf("%d\n", c);
}
int main()
{
int input = 0;
do
{
printf("请选择：");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出\n");
break;
case 1:
break;
case 2:
calc(Sub);
break;
case 3:
calc(Mul);
break;
case 4:
calc(Div);
break;
default:
printf("输入错误，重新输入\n");
}
} while (input);
return 0;
}

🚵在这里我们来比较普通写法和函数指针写法：

🚵 通过上图，就可以发现普通写法实属冗余，函数指针的方法简化了很多。

③用函数指针数组的写法，又称转移表

👇👇

#include <stdio.h>
{
printf("***************************\n");
printf("***************************\n");
printf("******    0.leave    ******\n");
printf("******    2.Sub      ******\n");
printf("******    3.Mul      ******\n");
printf("******    4.Div      ******\n");
printf("***************************\n");
printf("***************************\n");
}
{
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 a = 0;
int b = 0;
int c = 0;
do
{
printf("请选择：");
scanf("%d", &input);
if (input == 0)
printf("退出\n");
else if (input >= 1 && input <= 4)
{
int (*p[5])(int x, int y) = { 0,Add,Sub,Mul,Div };
printf("请输入俩个操作数：");
scanf("%d %d", &a, &b);
c = p[input](a, b);
//c = (*p[input])(a, b);这种格式也可以
printf("%d\n", c);
}
else
printf("输入错误，重新输入\n");
} while (input);
return 0;
}

🚵这里我们来比较一下函数指针和函数指针数组：

### 🚀结语：

|
15天前
|

30 7
|
15天前
|
C++ 索引 运维

17 6
|
15天前
|

19 6
|
2月前
|

21 3
|
2月前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
19 0
|
2月前
|

C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
19 0
|
2月前
|

C语言数组指针详解与应用
C语言数组指针详解与应用
23 0
|
2月前
|
C语言

36 4
|
27天前
|

【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
17 1
|
27天前
|

【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
19 1