【C语言】终の指针

2024-06-06 20:43:51 浏览数 (1)

一、回调函数

回调函数就是一个通过函数指针调用的函数。 把一个函数的指针作为参数传递给另一个函数,当这个指针被调用其所指向的函数时,被调用的函数就是回调函数 简单的说就是函数套函数,还是指针的用法,把相似的代码抽象成函数 在上一篇博文指针进阶中讲到的计算器程序,可以被简化

指针进阶点这里~ 这里我们复制一下上一篇博文的代码

代码语言:javascript复制
#include <stdio.h>
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()
{
	int x = 0;
	int y = 0;
	int input = 1;
	int(*p[5])(int x,int y) = {NULL,add,sub,mul,div};
	//首位放NULL,那么可以从1开始访问函数指针,当然也可以不放,但这么放更好,可以继续往下看,看看为什么这么放更好
	menu();
	do
	{
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入->");
			scanf("%d %d", &x, &y);
			printf("%dn", (*p[input])(x, y));
			//这里input就不会为零,whlie也会继续运行,我们写代码时要考虑上下不干扰的一致性
		}
		else if (input == 0)
		{
			printf("退出n");
		}
		else
		{
			printf("请重新输入n");
		}

	} while (input);
	return 0;
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/s_little_monster/article/details/136422391
代码语言:javascript复制
#include <stdio.h>
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");
}
//到这里以上都是相同的
void func(int (*pf)(int, int))
{
	int ret = 0;
	int x, y;
	printf("请输入:");
	scanf("%d %d", &x, &y);
	printf("结果为:%dn", pf(x, y));
}
//这里给了一个函数,函数的参数是一个函数指针,通过函数指针来调用函数,这就是回调函数
int main()
{
	int input = 1;
	do
	{
		menu();
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				func(add);
				break;
			case 2:
				func(sub);
				break;
			case 3:
				func(mul);
				break;
			case 4:
				func(div);
				break;
			case 0:
				printf("退出程序n");
				break;
			default:
				printf("请重新输入:n");
				break;
		}
//这里我们换成switch函数,便于理解回调函数
	} while (input);
	return 0;
}

二、qsort函数

qsort函数是一个快速排序函数 头文件为

代码语言:javascript复制
#include <stdlib.h>

1、整形比较

这里我们想要完成一个升序。 1、qsort第一个变量为数组首元素地址 2、qsort第二个变量为数组长度 3、qsort第三个变量为数据类型的长度 4、创建一个函数,参数为数组指针,将相邻的两个元素相减,返回一个值到qsort的第四个参数上,为一个区分正负零的数字 ,前边的数字减后边(序号小减序号大)的数字为升序,反之则为降序

代码语言:javascript复制
#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	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;
}

2、结构数据比较

①结构体

我们描述一个学生,我们用四个内容:

代码语言:javascript复制
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};

```c
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1;//这里不要忘记分号;s1这也是一种定义
struct Stu s2;//定义结构体变量
struct Stu s3 = { "zhangsan",18,"man","1234567" };//初始化
struct Stu s4 = {.id="1234568",.age=19,.sex="woman",.name="lisi"};//按自己想要的顺序初始化
struct Node
{
 int data;
 struct Stu s5;
 struct Node* next;
}n1 = { 10, {"zhaowu",20,"man","1234569"}, NULL };//结构体嵌套初始化
-> 的使用
代码语言:javascript复制
int main()
{
	struct Data
	{
		int a, b, c;
	};
	struct Data* p;
	struct Data A = { 1,2,3 };
	int x;
	p = &A;
	x = p->a;
	printf("%d", x);
}

取出p所指向的结构体中包含的数据项a赋值给x

③结构数据比较
代码语言:javascript复制
struct Stu 
{
	char name[20];
	int age;
};
//1、按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//2、按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//3、按照年龄来排序
void test2()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//4、按照名字来排序
void test3()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test2();
	test3();
	return 0;
}

今日分享完毕,谢谢收看

0 人点赞