C语言指针——函数指针(学习总结)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、函数名与数组名区别
  • 二、函数指针
    • 函数指针的创建与使用
    • 函数指针的辨别
  • 函数指针数组
    • 函数指针的创建
    • 函数指针的用处 - 简化
    • 问题:代码多重复!不够简洁


前言

一点小小的学习总结,望日后学习更加深入

一、函数名与数组名区别

对于数组来说 int arr[10] = { 0 };
arr != &arr 前者表示数组首元素的地址,后者表示整个数组的地址
对于函数来说 Add (int x, int y)
Add == &Add 二者等价

因此:函数指针使用时 * (解引用操作符)往往无意义

二、函数指针

函数指针的创建与使用

 //函数
 int Add(int x, int y)
 {
    return x+y;
 }
 int main(void)
 {
 //创建
    int (*pf)(int,int) = &Add; // = Add
 //使用
 //1.
    int ret = (*p)(4,6);
 //2.
    ret = p(4,6);
//均等价
    ret = Add(4,6);
    return 0;
 }

函数指针的辨别

1.  1. (*(void(*)())0)(); - 多操作符看优先级
解释:
  void(*)()
  (         )0 强制类型转换为函数指针,使0被解释为函数的地址
 *             解引用,相当于找到了0地址对应的函数
 (            ) () - 调用0地址处的函数

2. void (*signal(int, void(*)(int)))(int);
解释:
    signal(int, void(*)(int))  
void (*                       )(int)
就是一个函数,参数类型:第一个:int,第二个:函数指针
             函数名:signal
            返回类型:函数指针
    注意:void (*)(int) signal(int, void(*)(int)) 语法不支持,错误

函数指针数组

函数指针的创建

函数指针数组 - 存放函数指针的数组------------------------------
int add(int x, int y)
{
	return x + y;
}
int shi(int x, int y)
{
	return x - y;
}
int main(void)
{
	int (*pf1)(int, int) = &add;
	int (*pf2)(int, int) = &shi;
	//创建函数指针数组
	int (*pfarr[2])(int, int) = { pf1, shi };
	return 0;
}

函数指针的用处 - 简化

//函数指针数组的运用 - 制作计算器-加,减,乘,除
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
void menu()
{
	printf("*************************\n");
	printf("***** 1. add  2. sub*****\n");
	printf("***** 3. mul  4. div*****\n");
	printf("******* 0. exit**********\n");
	printf("*************************\n");
}
int main(void)
{
	int n = 0;
	do 
	{
		menu();
		int x = 0;
		int y = 0;
		int ret = 0;
		printf("请输入:>");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			 ret = add(x,y);
			 printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}
	} while (n);
	return 0;
}

问题:代码多重复!不够简洁

改进-使用函数指针
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
void menu()
{
	printf("*************************\n");
	printf("***** 1. add  2. sub*****\n");
	printf("***** 3. mul  4. div*****\n");
	printf("******* 0. exit**********\n");
	printf("*************************\n");
}
int main(void)
{
	int n = 0;
	do
	{
		menu();
		int x = 0;
		int y = 0;
		int ret = 0;
		printf("请输入:>");
		scanf("%d", &n);
		int (*pfarr[5])(int, int) = { NULL,add,sub,mul,div };
		//加一个空指针使下标与输入的相对于
		if (n >= 1 && n <= 4)
		{
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = (*pfarr[n])(x, y);
			printf("%d\n", ret);
		}
		else if (n == 0)
		{
			printf("退出程序\n");
			break;
		}
		else
		{
			printf("选择错误\n");
		}
		
	} while (n);
	return 0;
}

你可能感兴趣的:(c语言,学习)