C语言——函数指针、函数指针数组、转移表

一.函数指针

1.什么是函数指针?

函数指针也是指针,不过它指向的是函数的首地址。

体会下面一段代码:

int fun(){
    printf("hello!!!\n");
    return 10;
}

int main(){
    printf("%d  \n",fun());//调用fun函数
    int (*p) ()=fun;
    printf("%d  \n",(*p)());
    return 0;
}

可以看到两条语句执行的结果是一模一样的。

再观察下面这段 代码:

可见它指向的就是函数的首地址

2.怎样定义函数指针变量

例:①int (*p)  (函数参数)

            int:函数的返回值是int型的

        ②void (*p) ()

            void:函数的返回值类型是void,函数没有参数

二.函数指针数组

它是数组,数组的元素是函数指针

例如:

①int (*p[10]) ()

定义了一个有10个元素的函数指针数组,它的每一个元素都是函数指针,函数指针的类型是int(*)()

②void (*q[20]) (int a,int (*p) () )

定义了一个由20个元素的函数指针数组,它的每一个元素都是函数指针,函数指针的类型是void(*) (int ,int (*) ()).

它的函数参数中一个是int,另一个是函数指针类型,int (*)()

三.转移表(表驱动)

通过函数指针数组实现

典型实例:计算器

运算器的函数:

double add(double a, double b) {
	return a + b;
}

double minus(double a, double b) {
	return a - b;
}

double mul(double a, double b) {
	return a * b;
}

double divs(double a, double b) {
	return a / b;
}

1.switch语句实现

int main() {
	while (1) {
		printf("=================================\n");
		printf("1.加法\n");
		printf("2.减法\n");
		printf("3.乘法\n");
		printf("4.除法\n");
		printf("=================================\n");
		printf("请输入您的选择:");
		int choice;
		scanf("%d", &choice);
		double a, b;
		double ret = 0;
		switch (choice) {
		case 1:
			printf("请输入操作数:");			
			printf("a=");
			scanf("%lf", &a);
			printf("b=");
			scanf("%lf", &b);
			ret = add(a, b);
			break;
		case 2:
			printf("请输入操作数:");
			printf("a=");
			scanf("%lf", &a);
			printf("b=");
			scanf("%lf", &b);
			ret = minus(a, b);
			break;
		case 3:
			printf("请输入操作数:");
			printf("a=");
			scanf("%lf", &a);
			printf("b=");
			scanf("%lf", &b);
			ret = mul(a, b);
			break;
		case 4:
			printf("请输入操作数:");
			printf("a=");
			scanf("%lf", &a);
			printf("b=");
			scanf("%lf", &b);
			ret = divs(a, b);
			break;
		default:
			printf("输入错误!!!\n");
			break;
		}
		printf("result=%lf\n", ret);		
	}
    return 0;
}

2.转移表实现

	double(*p[5])() = { 0,add,minus,mul,divs };
	while (1) {
		printf("=================================\n");
		printf("1.加法\n");
		printf("2.减法\n");
		printf("3.乘法\n");
		printf("4.除法\n");
		printf("=================================\n");
		printf("请输入您的选择:");
		int choice;
		scanf("%d", &choice);
		if (choice <= 4 && choice > 0) {
			double a, b;
			double ret = 0;
			printf("a=");
			scanf("%lf", &a);
			printf("b=");
			scanf("%lf", &b);
			ret = p[choice](a, b);
			printf("result=%lf\n", ret);
		}
		else {
			printf("输入错误!!!\n");
			break;
		}
    }

通过转移表,我们减少了代码的冗余情况,而且后期更加便于维护。

发布了58 篇原创文章 · 获赞 43 · 访问量 4422

猜你喜欢

转载自blog.csdn.net/Wz_still_shuai/article/details/89384619