创建函数指针数组

发布于 2024-07-08 12:09:40 字数 2710 浏览 8 评论 0

先从一个例子开始,下面的程序是女神对下面的屌丝们发信息,信息类型有(分手,第二次机会和结婚), 我们脑海里可能想起了 enum 设置三种类型, struct 定义结构,分别定义三种函数进行操作。如下代码:

enum response_type {DUMP, SECOND_CHANCE, MARRIAGE};

typedef struct {
  char *name;
  enum response_type type;
} response;

void dump(response r){
  printf("DUMP:%s\n", r.name);
}

void second_chance(response r) {
  printf("SC:%s\n", r.name);
}

void marriage(response r) {
  printf("Marriage:%s\n", r.name);
}

int main(int argc, char *argv[]) {
  response r[] = {
    {"Jack", DUMP},
    {"Link", DUMP},
    {"Lurcy", SECOND_CHANCE},
    {"Rose", MARRIAGE}
  };
  for(int i=0; i<4; i++) {
    if(r[i].type == DUMP) {
      dump(r[i]);
    } else if (r[i].type == SECOND_CHANCE) {
      second_chance(r[i]);
    } else {
      marriage(r[i]);
    }
  }
  return 0;
}

从上面代码看出我们需不断 if,调用不同的函数,一旦函数变多了,就有点麻烦了。此时就该 函数指针数组 发挥作用了。

如果再一个数组中保存函数名:

replies[] = {dump, second_chance, marriage}

这种做法行不通, 我们必须要告诉编译器它的返回类型,参数类型等, 有点像函数指针的声明, 正确的写法如下:

void(*replies[])(response) = {dump, second_chance, marriage}

我们发现枚举顺序与函数指针数组对应的顺序一样, 枚举中元素从 0 开始,也就是 DUMP=0, SECOND_CHANCE=1..,

enum response_type {DUMP, SECOND_CHANCE, MARRIAGE};
void(*replies[])(response) = {dump, second_chance, marriage}

可以通过 response_type 枚举来获取数组中函数指针:

enum response_type {DUMP, SECOND_CHANCE, MARRIAGE};

typedef struct {
  char *name;
  enum response_type type;
} response;

void dump(response r){
  printf("DUMP:%s\n", r.name);
}

void second_chance(response r) {
  printf("SC:%s\n", r.name);
}

void marriage(response r) {
  printf("Marriage:%s\n", r.name);
}

// 声明函数指针
//void (*Ddump)(response);
//void (*Ssecond_chance)(response);
//void (*Mmarriage)(response);

// 创建函数指针数组
void (*funcs[])(response) = {dump, second_chance, marriage};

int main(int argc, char *argv[]) {
  response r[] = {
    {"Jack", DUMP},
    {"Link", DUMP},
    {"Lurcy", SECOND_CHANCE},
    {"Rose", MARRIAGE}
  };
  for(int i=0; i<4; i++) {
    funcs[r[i].type](r[i]); // or: (funcs[r[i].type])(r[i])
  }

  return 0;
}

来分解这个函数:

这样做的好处是:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文