小工具知识网

当前位置: 首页 > 行业知识 > C语言:大战指针“哥斯拉”(3)

行业知识

C语言:大战指针“哥斯拉”(3)

2026-10-25 17:13:43 来源:互联网转载

���录

一、前言

二、函数指针数组

三、回调函数

四、qsort函数

(一)排序整型数据 

 (二)排序结构数据

(三)模拟实现qsort函数 

 五、总结


一、前言

大家新年好,小欣在这里祝大家新年快乐,身体健康,学业进步,拿到心仪的offer!!!在新的一年里,小欣将继续和大家一起学习并分享知识点,让我们一起携手并进,书写2024年的精彩画卷!!!今天我们一起学习打败指针“哥斯拉”的最后一招。

二、函数指针数组

所谓函数指针数组,就是一个存放函数指针的数组。我们以一个计算器程序为例子。

代码如下所示:

#define _CRT_SECURE_NO_WARNINGS#include void menu(){printf("==========================================\n");printf("|             1.Add     2.Sub            |\n");printf("|             3.Mul     4.Div            |\n");printf("|             0.exit                     |\n");printf("==========================================\n");}//加法运算int add(int a, int b){return a + b;}//减法运算int sub(int a, int b){return a - b;}//乘法运算int mul(int a, int b){return a * b;}//除法运算int p(int a, int b){return a / b;}int main(){int x, y;int input = 1;int ret = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("输入操作数:");scanf("%d %d", &x, &y);ret = add(x, y);printf("%d\n", ret);break;case 2:printf("输入操作数:");scanf("%d %d", &x, &y);ret = sub(x, y);printf("%d\n", ret);break;case 3:printf("输入操作数:");scanf("%d %d", &x, &y);ret = mul(x, y);printf("%d\n", ret);break;case 4:printf("输入操作数:");scanf("%d %d", &x, &y);ret = p(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;}

我们可以发现,实现这样一个简单的计算器程序代码比较多也有些冗余,维护起来也比较麻烦。

现在,我们用函数指针数组来修改上面的代码,让代码变简洁,进而更好维护。

修改后的代码如下:

#define _CRT_SECURE_NO_WARNINGS#include //计算器(转移表)void menu(){printf("==========================================\n");printf("|             1.Add     2.Sub            |\n");printf("|             3.Mul     4.Div            |\n");printf("|             0.exit                     |\n");printf("==========================================\n");}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 input = 0;int a = 0;int b = 0;int ret = 0;do{menu();//使用函数指针数组的方式//这里函数指针数组的效果,我们称为转移表int (*pfArr[])(int, int) = { NULL,Add,Sub,Mul,Div };printf("请选择:");scanf("%d", &input);if (input == 0){printf("退出计算器\n");}else if (input >= 1 && input   name, ((struct Stu*)p2)->name);}void test2(){struct Stu arr[] = { {"ZhnagSan",20}, {"LiSi",18},{"WangWu",22} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);int i = 0;for (i = 0; i age - ((struct Stu*)p2)->age;}void test3(){struct Stu arr[] = { {"ZhnagSan",20}, {"LiSi",18},{"WangWu",22} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);int i = 0;for (i = 0; i  

排序后的结果如下: 

注意:比较两个结构体数据,不能用>

比较字符要使用库函数strcmp

strcmp其实是按照对应位置上的字符的ASCII码值的大小进行比较

(三)模拟实现qsort函数 

qsort是一个库函数,它是使用快速排序的算法来进行排序的。在上一期我们讲过冒泡排序的原理和使用,感兴趣的朋友可以参考C语言:大战指针“哥斯拉”(2),现在我们将冒泡排序进行改造,来模拟实现qsort函数。

Tips:

改造的前提仍是使用冒泡排序

1.比较的代码部分要改成回调函数。

2.交换的代码部分也要进行修改。

#define _CRT_SECURE_NO_WARNINGS//设计和实现bubble_sort,这个函数能够排序任何类型的数据。#include #include void print(int arr[], int sz){int i = 0;for (i = 0; i  0){//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}}void test(){int arr[] = { 1,5,6,8,7,3,2,10,4,9 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);print(arr, sz);}int main(){test();return 0;}

 升序排序结果如下:

小知识:

int (* compar)( const void *, const void * )

函数规定,在待比较的两个参数中,若

前一个参数 > 后一个参数,则返回值>0;

前一个参数 = 后一个参数,则返回值=0;

前一个参数 name);}int cmp_stu_by_age(const void* p1, const void* p2){return ((struct Stu*)p1)->age, ((struct Stu*)p2)->age;}void Swap(char* buf1, char* buf2, size_t width){int i = 0;for (i = 0; i 0){//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}}void test(){struct Stu arr[] = { {"Zhangsan",18},{"LiSi",24},{"WangWu",20} };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);//打印arr数组的内容int i = 0;for (i = 0; i

输出结果:

 

我们在模拟实现qsort函数时要注意,函数的形参一直都是 void* 型,传入的实参要通过强制类型转换后才能得到返回值。

 五、总结

通过上面的学习,恭喜大家学会打败指针“哥斯拉”的最后一招,同时蜡笔小欣也给大家的坚持点赞。指针让我们在写代码程序时更加方便快捷,也能简化一下冗余的代码,只要我们平时多加练习,对指针的使用会更加熟练,我们下期再见。

上一篇:战地五怎么搜服务器数字?

下一篇:手机服务器端口怎么查看?