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

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

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

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

enum response_type {DUMP,SECOND_CHANCE,MARRIAGE,LAW_SUIT};
typedef struct
{
char *name;
enum response_type type;
}response;

回信内容所调用的方法:

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

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. 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )

    一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...

  2. 【BZOJ 2005】[Noi2010]能量采集 (容斥原理| 欧拉筛+ 分块)

    能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋 ...

  3. while +next 循环 回到循环顶端

    my $show_tip = 1; sub login { while (1) { my $api ="https://login.weixin.qq.com/cgi-bin/mmwebwx ...

  4. UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  6. 如何实现Azure虚拟网络中点到站VPN的自动重连

     在Windows Azure早期版本中,用户要在某台Azure平台之外的机器与Azure平台内部的机器建立专用连接,可以借助Azure Connect这个功能.当前的Azure版本,已经没有Az ...

  7. 《锋利的Jquery第二版》读书笔记 第二章

    本章节主要Jquery选择器 jquery选择器与css选择器十分相似,特别需要注意的是 <script type="text/javascript"> documen ...

  8. 4 weekend110的hdfs下载数据源码跟踪铺垫 + hdfs下载数据源码分析-getFileSystem(值得反复推敲和打断点源码)

    Hdfs下载数据源码分析 在这里,我是接着之前的,贴下代码 package cn.itcast.hadoop.hdfs; import java.io.FileInputStream; import ...

  9. Yii framework 应用总结小窍门(转)

    1. Yii Framework] 如何获取当前controller的名称? 下面语句就可以获取当前控制器的名称了! Yii::app()->controller->id 2. yii 如 ...

  10. get改造成post请求

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...