名字有点绕口,其实更应该翻译为指针函数数组.

记录下对Head-First C这一节的理解,几乎每天班车上都会咪两眼,几乎每次都是看不懂,敲一敲的时候才有些明白.

通俗点讲,这功能解决的是,具有同种签名的方法的数组式调用. 还是不够通俗,书上讲的很通俗:分手信生成器.

对号入座,这是士兵结构体,包含名字以及回信内容类型

  1. enum response_type {DUMP,SECOND_CHANCE,MARRIAGE,LAW_SUIT};
  2. typedef struct
  3. {
  4. char *name;
  5. enum response_type type;
  6. }response;

回信内容所调用的方法:

  1. void dump(response r)
  2. {
  3. printf("Dear %s,\n",r.name);
  4. puts("我們分手吧");
  5. }
  6.  
  7. void second_chance(response r)
  8. {
  9. printf("Dear %s,\n",r.name);
  10. puts("再給你一次機會");
  11. }
  12.  
  13. void marriage(response r)
  14. {
  15. printf("Dear %s,\n",r.name);
  16. puts("我們結婚吧");
  17. }
  1. //
  2. //函数指针数组
  3. //
  4. //
  5. //定義說明:
  6. //
  7. //void 必须是void类型
  8. //(*replies[]) 数组声明,注意是指针数组,需要用*
  9. //(response) 函数接收的参数类型,若有多个,应该是:类型,类型。。。
  10. //{dump,second_chance,marriage} 函数列表,dump,second_chance,marriage是函数名,注意不是枚舉值,枚舉值是大寫的
  11. //
  12. //
  13. //调用方法:
  14. //(replies[r[i].type])(r[i])
  15. //
  16. //其實就是:
  17. //函數名(參數列表)
  18. //
  19. //
  20. //函數名:
  21. //(replies[r[i].type])
  22. //
  23. //r是struct类型,type是枚举类型,枚举类型从0开始
  24. //所以上面的这句如果直接写死的话可以写为:
  25. //(replies[0]),
  26. //也就是说r[i].type取得了一个索引,这个索引决定了要调用的方法的索引:
  27. //{dump,second_chance,marriage}
  28. //{0,1,2}
  29. //r[0].type=dump,也就是调用dump方法,
  30. //然后为dump方法准备传入参数:r[i]
  31. //
  32. //参数列表:
  33. //例如:dump(response r)接收struct response的类型,所以为其准备的参数r[i]就是这种类型
  34.  
  35. void (*replies[])(response)={dump,second_chance,marriage,law_suit};
  1. int main()
  2. {
  3. response r[]=
  4. {
  5. {"Mike",DUMP},
  6. {"Geroge",MARRIAGE},
  7. {"Vincent",DUMP},
  8. {"Galleleo",SECOND_CHANCE},
  9. {"Furler",MARRIAGE},
  10. {"T-BAG",LAW_SUIT}
  11. };
  12.  
  13. int i,len=0;
  14. GET_ARRAY_LEN(r,len);
  15.  
  16. for(i=0;i<len;i++)
  17. {
  18. /*
  19. //这是常见的使用switch的方法,如果要加一种类型,可能修改的地方比较多
  20. switch(r[i].type)
  21. {
  22. case DUMP:
  23. dump(r[i]);
  24. break;
  25. case SECOND_CHANCE:
  26. second_chance(r[i]);
  27. break;
  28. case MARRIAGE:
  29. marriage(r[i]);
  30. break;
  31. }
  32. */
  33.  
  34. (replies[r[i].type])(r[i]);
  35. }
  36.  
  37. return 0;
  38. }

C 函数指针数组的更多相关文章

  1. C++基础——函数指针 函数指针数组

    ==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...

  2. typedef 函数指针 数组 std::function

    1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA,  *PDATA;  //D ...

  3. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  4. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    #include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...

  5. C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子

    先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...

  6. C语言的函数指针数组(好绕啊~看完这篇估计就通关了)

    转自https://www.cnblogs.com/chr-wonder/p/5168858.html int *(*p(int))[3] 今天有人问这个是啥?我一看直接就懵逼了…… 下面做一些简单的 ...

  7. C++ code:函数指针数组

    函数指针作为一种数据类型,当然可以作为数组的元素类型.例如,要实现用菜单来驱动函数调用的程序框架,则用函数指针数组来实现就比较容易维护. #include<iostream> using ...

  8. c语言.函数指针数组

    函数指针: 一个指向函数的指针.一般用函数名表示. 函数指针数组:元素为函数指针的数组.转移表.c语言中函数不可以定义为数组,只能通过定义函数指针来操作. #include<stdio.h> ...

  9. 转:函数指针数组的妙用(I)

    转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* ...

随机推荐

  1. 加JENKINS的SLAVE节点(LINUX)要注意的事项

    从昨天下午到现在,终于解决了所有的问题.作如下记录要点: 1,从节点只要建好目录,JENKINS的包,MASTER会推送过来. 2,ANT,MAVEN之类的,要配置好环境变量,PROFILE.D .B ...

  2. Analysis Guidelines

    This section describes some best practices for analysis. These practices come from experience of ana ...

  3. 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息

    三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.

  4. VS2008编译器编译出来的文件比mingw编译的要几乎小一半

    为什么要在VS2008中使用QT静态编译呢?很简单,因为VS2008编译器编译出来的文件比mingw编译的要几乎小一半. 好了现在我们来做些准备工作,VS2008自然要安装的,然后打上SP1的补丁.然 ...

  5. Python Monkey patch猴子补丁

    monkey patch (猴子补丁)   用来在运行时动态修改已有的代码,而不需要修改原始代码. 简单的monkey patch 实现:[python] #coding=utf-8 def orig ...

  6. 设置SharePoint2010列表的项目级权限

    转:http://www.cfanz.cn/?c=article&a=read&id=24096 在SharePoint2010中我们经常会用到这样的权限设置,在一个列表中可以存储多个 ...

  7. ECSHOP首页调用指定分类下的商品

    转:http://bbs.ecshop.com/thread-1123207-1-1.html 调用某个分类下的商品,方法有很多种的,不过都需要先在后台设置模板那里设置显示和显示条数, 然后在需要调用 ...

  8. HDOJ --- 1159 Common Subsequence

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. ORA-00054:资源正忙,要求指定NOWAIT

    --ORA-00054:资源正忙,要求指定NOWAIT-- --以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句-- SELECT sid, serial#, username, osus ...

  10. 页面与母版页面的asp:ContentPlaceHolder不匹配

    问题描述:The page has one or more <asp:Content> controls that do not correspond with <asp:Conte ...