函数指针数组的例子

来看这么一段代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE}
	};
 
	int index;
	for (index = 0; index < 4; index++)
	{
		switch (r[index].type)
		{
		case DUMP:
			dump(r[index]);
			break;
		case SECOND_CHANCE:
			second_chance(r[index]);
			break;
		case MARRIAGE:
			marriage(r[index]);
			break;
		default:
			break;
		}
	}
 
 
	return 0;
}


这个程序是可以执行的,并且是正确的。但是代码中充斥着大量的函数调用,每次都需要根据r的type来调用函数,看起来像这样:

		switch (r.type)
		{
		case DUMP:
			dump(r[index]);
			break;
		case SECOND_CHANCE:
			second_chance(r[index]);
			break;
		case MARRIAGE:
			marriage(r[index]);
			break;
		default:
			break;
		}

这么一来,如果增加r的第四种类型,那就不得不修改程序中每一个像这样的地方。很快,就有一大堆代码需要维护,而且这样很容易出错。



下面来看,如何通过创建函数指针数组来替代上面的这些代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
void (*replise[])(response) = { dump, second_chance, marriage };
 
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE}
	};
 
	int index;
	for (index = 0; index < 4; index++)
	{
		replise[r[index].type](r[index]);
	}
 
 
	return 0;
}

可以看到,我们这里已经没有了那么一大段的switch代码。但是程序依然是和上边的初始程序一样的运行结果。

 

就这么一行代码,代替了上面的一大段switch代码!

 

那么我们现在来看增加r的第四种类型时候的代价:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
 
enum response_type
{
	DUMP,
	SECOND_CHANCE,
	MARRIAGE,
	DEAD
};
 
 
typedef struct
{
	char *name;
	enum response_type type;
}response;
 
 
void dump(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dump function\n");
}
 
 
void second_chance(response r)
{
	printf("Dear %s, \n", r.name);
	puts("second_chance function\n");
}
 
 
void marriage(response r)
{
	printf("Dear %s, \n", r.name);
	puts("marriage function\n");
}
 
 
void dead(response r)
{
	printf("Dear %s, \n", r.name);
	puts("dead function\n");
}
 
 
void (*replise[])(response) = { dump, second_chance, marriage, dead };
 
int main()
{
	response r[] = {
		{"Mike", DUMP}, {"Luis", SECOND_CHANCE},
		{"Matt", SECOND_CHANCE}, {"William", MARRIAGE},
		{"Zeng", DEAD},
	};
 
	int index;
	for (index = 0; index < 5; index++)
	{
		replise[r[index].type](r[index]);
	}
 
 
	return 0;
}


对比一下,可以看到,仅仅需要修改3个地方,便能够加入一个对应的函数!维护代价大大的减少了!


你可能感兴趣的:(函数指针数组的例子)