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