创建函数指针数组
先从一个例子开始,下面的程序是女神对下面的屌丝们发信息,信息类型有(分手,第二次机会和结婚), 我们脑海里可能想起了 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 技术交流群。
上一篇: C 语言 void 指针
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论