个人主页点这里~
指针初阶点这里~
指针初阶2.0点这里~
指针进阶点这里~
终の指针
- 一、回调函数
- 二、qsort函数
- 1、整形比较
- 2、结构数据比较
- ①结构体
- ②`->` 的使用
- ③结构数据比较
一、回调函数
回调函数就是⼀个通过函数指针调用的函数。
把一个函数的指针作为参数传递给另一个函数,当这个指针被调用其所指向的函数时,被调用的函数就是回调函数
简单的说就是函数套函数,还是指针的用法,把相似的代码抽象成函数
在上一篇博文指针进阶中讲到的计算器程序,可以被简化
指针进阶点这里~
这里我们复制一下上一篇博文的代码
#include 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("%d\n", (*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
#include 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("结果为:%d\n", 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函数是一个快速排序函数
头文件为
#include
1、整形比较
这里我们想要完成一个升序。
1、qsort第一个变量为数组首元素地址
2、qsort第二个变量为数组长度
3、qsort第三个变量为数据类型的长度
4、创建一个函数,参数为数组指针,将相邻的两个元素相减,返回一个值到qsort的第四个参数上,为一个区分正负零的数字 ,前边的数字减后边(序号小减序号大)的数字为升序,反之则为降序
#include 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、结构数据比较
①结构体
我们描述一个学生,我们用四个内容:
struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号};```cstruct 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 };//结构体嵌套初始化
②->
的使用
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
③结构数据比较
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;}
今日分享完毕,谢谢收看