C语言(19)

发布于:2025-02-20 ⋅ 阅读:(141) ⋅ 点赞:(0)

深入理解指针(4)

1.回调函数

一个通过函数指针调用的函数

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于响应

如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数是回调函数

举例说明:

//关于回调函数的应用例子
//关于加减乘除运算
//没有使用回调函数:
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;
}
int main()
{
	int x, y;
	int input = 0;
	int ret = 0;
	do
	{
		printf("************\n");
		printf("请输入你要选择的数字:\n");
		printf("0.退出程序\n");
		printf("1.加法运算\n");
		printf("2.减法运算\n");
		printf("3.乘法运算\n");
		printf("4.整除运算\n");
		printf("************\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("程序结束\n");
			break;
		case 1:
			printf("请输入:\n");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("结果是:%d\n", ret);
		case 2:
			printf("请输入:\n");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("结果是:%d\n", ret);
		case 3:
			printf("请输入:\n");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("结果是:%d\n", ret);
		case 4:
			printf("请输入:\n");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("结果是:%d\n", ret);
		default:
			printf("输入错误,请重新输入:\n");
		}
	} while (input);
		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 abc(int(*pf)(int , int ))
{
	int ret = 0;
	int x, y;
	printf("请输入:\n");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("结果是:%d\n", ret);
}
int main()
{
	int x, y;
	int input = 0;
	int ret = 0;
	do
	{
		printf("************\n");
		printf("请输入你要选择的数字:\n");
		printf("0.退出程序\n");
		printf("1.加法运算\n");
		printf("2.减法运算\n");
		printf("3.乘法运算\n");
		printf("4.整除运算\n");
		printf("************\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("程序结束\n");
			break;
		case 1:
			abc(add);
		case 2:
			abc(sub);
		case 3:
			abc(mul);
		case 4:
			abc(div);
		default:
			printf("输入错误,请重新输入:\n");
		}
	} while (input);
	return 0;
}

代码中的abc便是通过回调函数,运用函数指针来调用各个函数,被调用的add,sub,mul,div被称为回调函数

2.qsort的使用举例

qsort是C语言中的一个库函数

这个函数是用来对数据进行排序,对任意数据都能进行排序(默认排升序)

tips:两个字符串大小的比较不能使用<,>,<=,>=,==,!=,应该用strcmp

         比较结构体也不能用那些操作符

用法:void qsort (void*base,  //指向待排序数组的第一个元素的指针

                             size_t num, //base指向数组中的元素个数

                             size_t size //base指向数组中一个元素的大小,单位是字节

           int(*cmp)(const void*,conse void*)  //函数指针——传递函数地址

     这是数组两元素进行比较的函数,比较后默认会按照升序

p1>p2     >0

    <         <0

    =         =0

int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1,4,3,5,2,6,7,8,0,9 };
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

tips:结构体成员访问操作符:

"."      结构体变量.成员名

"->"    结构体指针->成员名

//strcmp比较字符串是比较对应字符的ASCII值,与长度无关


网站公告

今日签到

点亮在社区的每一天
去签到