C 函數指針數組

名字有點繞口,其實更應該翻譯爲指針函數數組.數組

記錄下對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;
}
相關文章
相關標籤/搜索