C语言学习笔记(指针4)

121 阅读1分钟

​「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

 总结:

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	//指针数组
	//int* arr[10];
	//数组指针
	//int*(*pa)[10] = &arr;
	//函数指针
	int (*pAdd)(int, int) = Add;//&Add
	//int sum =(*pAdd)(1,2);
	//int sum =*pAdd(1,2);
	//printf("sum = %d\n",sum);
	//函数指针的数组
	int(*pArr[5])(int, int);
	//指向函数指针数组的指针
	int(* (*pArr)[5])(int, int) = &pArr;
	return 0;
}

回调函数:​

举例:

void print(char *str)
{
	printf("hehe:%s", str);
}

void test(void(*p)(char*))
{
	printf("test\n");
	p("bit");
}
int main()
{
	test(print);
	return 0;
}

应用 

do
	{
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数:>");
			scanf("%d%d", &x, &y);
			printf("%d\n",Add(x, y));
			break;
		case 2:
			printf("请输入两个操作数:>");
			scanf("%d%d", &x, &y);
			printf("%d\n", Sub(x, y));
			break;
		case 3:
			printf("请输入两个操作数:>");
			scanf("%d%d", &x, &y);
			printf("%d\n", Mul(x, y));
			break;
		case 4:
			printf("请输入两个操作数:>");
			scanf("%d%d", &x, &y);
			printf("%d\n", Div(x, y));
			break;
		
		case 0:
			printf("退出\n");
		default:
			printf("选择错误\n");
			break;
		}

这段代码中

printf("请输入两个操作数:>");
scanf("%d%d", &x, &y);

出现了多次,如何运用回调函数简化代码呢?

 void Calc(int(*pf)(int,int))
{	
	int x = 0;
	int y = 0;
	printf("请输入两个操作数:>");
	scanf("%d%d", &x, &y);
	printf("%d\n", pf(x, y));
}

 switch (input)
 {
 case 1:
	 Calc(Add);
	 break;
 case 2:
	 Calc(Sub);
	 break;
 case 3:
	 Calc(Mul);
	 break;
 case 4:
	 Calc(Div);
	 break;

 case 0:
	 printf("退出\n");
 default:
	 printf("选择错误\n");
	 break;

 补充:

int  main()
{
	int a = 10;
	int* pa = &a;
	void* p = &a;//void* 类型的指针,可以接受任意类型的地址
	// void* 类型的指针不可以进行解引用操作
	//void*类型的指针不可以进行+—整数的操作
	return 0;
}

qsort - 库函数 - 排序 

快速排序

第一个参数:待排序数组的首元素的地址
第二个参数:待排序数组的元素个数
第三个参数:  待排序的数组的每个元素的大小 - 单位是字节
第四个参数:是函数指针,比较两个函数所用函数的地址 - 这个函数使用者自己实现

                      函数指针的两个参数是:待比较的两个元素的地址