指针的进阶【下篇】

简介: 指针的进阶【下篇】

📀8.指向函数指针数组的指针

🌰请看代码与注释👇

int Add(int x, int y)
{
  return x + y;
}
int Sub(int x, int y)
{
  return x - y;
}
int main()
{
  int (*pf)(int, int) = Add;
  //函数指针数组
  int (*pfArr[4])(int, int) = { Add,Sub };
  int (*(*ppfArr)[4])(int, int) = &pfArr;
  //ppfArr 是一个指向函数数组的指针
  return 0;
}


📀9.回调函数

💡回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。


🌰举个例子👇

💡还是一个简易计算器👇

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 menu()
{
  printf("****************************************\n");
  printf("******    1.add        2.sub     *******\n");
  printf("******    3.mul        4.div     *******\n");
  printf("******          5.exit           *******\n");
  printf("****************************************\n");
}
int main()
{
  int input = 0;
  int x = 0;
  int y = 0;
  int ret = 0; 
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    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;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
  return 0;
}

☝️虽然可以很好的运行出来,但是看一下这段代码是不是有些冗余🥺

8665f8fca547474b9f4101e62078988e.png

大部分代码都是重复的,只有调用执行 + - * / 运算的时候不一样,那么我们可不可以把这每段重复的部分封装成一个函数呢❓

我们来进行优化改装一下👇

void Calc(int(*pf)(int, int))
{
  int x = 0;
  int y = 0;
  int ret = 0;
  printf("请输入两个操作数:>");
  scanf("%d %d", &x, &y);
  ret = pf(x, y);
  printf("%d\n", ret);
}

💡 我们把每次输入输出 执行运算封装成这样的一个函数,只保留一个,使用函数指针来接收

💡 优化后的源码👇

#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;
}
void menu()
{
  printf("****************************************\n");
  printf("******    1.add        2.sub     *******\n");
  printf("******    3.mul        4.div     *******\n");
  printf("******          5.exit           *******\n");
  printf("****************************************\n");
}
void Calc(int(*pf)(int, int))
{
  int x = 0;
  int y = 0;
  int ret = 0;
  printf("请输入两个操作数:>");
  scanf("%d %d", &x, &y);
  ret = pf(x, y);
  printf("%d\n", ret);
}
int main()
{
  int input = 0;
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      Calc(Add);
      break;
    case 2:
      Calc(Sub);
      break;
    case 3:
      Calc(Mul);
      break;
    case 4:
      Calc(Div);
      break;
    case 0:
      printf("退出计算器\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
  return 0;
}

c584313ed2e94c59a6c404eb6975086f.png

目录
相关文章
|
1月前
|
C语言
【C语言】指针进阶之sizeof和strlen函数的对比
【C语言】指针进阶之sizeof和strlen函数的对比
|
1月前
|
C语言
C语言---指针进阶
C语言---指针进阶
19 0
|
1月前
C进阶:指针的练习(1)
C进阶:指针的练习(1)
|
1月前
C进阶:指针的进阶(4)
C进阶:指针的进阶(4)
|
1月前
|
存储 C语言
C进阶:指针的进阶(1)
C进阶:指针的进阶(1)
|
1月前
|
存储 C语言 C++
C语言指针进阶-1
C语言指针进阶-1
24 1
|
1月前
|
存储 C语言 C++
【指针的进阶】C语言
【指针的进阶】C语言
|
1月前
|
C语言
【C语言进阶】 指针进阶(二)
【C语言进阶】 指针进阶(二)
|
1月前
|
C语言 C++
【C语言进阶】 指针进阶(一)
【C语言进阶】 指针进阶(一)
|
1月前
|
C语言
【C语言】指针进阶之传值调用与传址调用
【C语言】指针进阶之传值调用与传址调用