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

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

🔥🔥函数指针:指向函数的指针变量

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

那么,函数名也可以得到地址吗?

答案是:可以的,函数名得到的是函数的地址。

下面这俩种方式均可以取出函数的地址

&函数名

函数名

🚵书写格式

数组指针的书写格式是这样的

int arr[5]={0};

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

函数指针和数组指针类似;

int (*pf)(int,int)=&Add;

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

或int ret=pf(2,3);

注意:有 * 就一定要有( )

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

#include <stdio.h>
int Add(int x, int y)
{
  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()
{
  calc(Add);
  return 0;
}

具体剖析一下


🔥🔥函数指针数组:存放函数指针的数组

int (*arr[4])(int,int)={Add,Sub,Mul,Div};

int (*parr1[10])( );

用法尽在转移表中


🔥🔥🔥计算器 / 转移表

举例:写个计算器

这里介绍三种写法:普通方法、函数指针方法、函数指针数组方法

①普通的写法:

👇👇

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

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

这俩种方法并没有优劣,只是提供了不同的做题角度

具体剖析函数指针数组:

将Add、Sub、Mul、Div 函数的地址存放在函数指针数组里,用户输入input,再通过(*p[input])找到正确的函数地址


🚀结语:

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

相关文章
|
1天前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
8 2
|
1天前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
6 1
|
1天前
|
Serverless C语言
【C语言】:对(一维)数组与指针的深入理解(1)
【C语言】:对(一维)数组与指针的深入理解(1)
5 1
|
4天前
|
C语言
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
|
4天前
|
C语言
C语言--指针数组和数组指针的区别
C语言--指针数组和数组指针的区别
|
6天前
【洛谷 P1563】[NOIP2016 提高组] 玩具谜题(模拟+结构体数组+指针)
**摘要:** NOIP2016提高组的玩具谜题是一个编程挑战,涉及理解玩具小人在圆圈中的相对位置。题目要求解决一系列基于小人朝向(内或外)的左右数指令,来找到最终目标小人。输入包含小人数量、指令数、每个小人的朝向和职业,以及指令详情。输出是最后到达的小人的职业。给定的AC代码使用指针模拟环状数组,通过按位异或判断朝向来移动指针。样例展示了问题的解决过程。子任务有不同的数据规模和限制条件。
12 0
|
26天前
|
C语言
C语言指针带代码
C语言指针带代码
24 3
|
11天前
|
安全 程序员 编译器
【C语言基础】:深入理解指针(二)
【C语言基础】:深入理解指针(二)
【C语言基础】:深入理解指针(二)
|
2天前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节
|
11天前
|
C语言
【C语言基础】:深入理解指针(终篇)
【C语言基础】:深入理解指针(终篇)