名字有點繞口,其實更應該翻譯爲指針函數數組.數組
記錄下對Head-First C這一節的理解,幾乎天天班車上都會咪兩眼,幾乎每次都是看不懂,敲一敲的時候纔有些明白.函數
通俗點講,這功能解決的是,具備同種簽名的方法的數組式調用. 仍是不夠通俗,書上講的很通俗:分手信生成器.ui
對號入座,這是士兵結構體,包含名字以及回信內容類型url
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; }