【c语言】了解指针,爱上指针(5)

2024-05-26 01:12
文章标签 语言 指针 了解 爱上

本文主要是介绍【c语言】了解指针,爱上指针(5),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

了解指针,爱上指针(5)

  • 回调函数
  • qsort函数
  • 冒泡排序模拟实现qsort函数

回调函数

回调函数:就是一个通过函数指针调用的函数。
把函数的指针作为参数传给另一个函数,当这个指针被用来调用指向的函数时,此时被调用的函数就是回调函数。

前面我们讲到了转移表,在这把转移表的代码在回顾一遍:

void menu()
{printf("*************************************************\n");printf("*************************************************\n");printf("*******1.Add    2.Sub    3.Div      4.Mul********\n");printf("********************0.退出***********************\n");printf("*************************************************\n");
}int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Div(int x, int y)
{return x / y;
}int mul(int x, int y)
{return x * y;
}int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;int (*p[5])(int x, int y) = { 0,Add,Sub,Div,mul };do{printf("请选择:");scanf("%d",&input);if (input>=1&&input<=4){printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);printf("%d\n", ret);}else if (input == 0){printf("退出计算器\n");}else{printf("请重新输入\n");}} while(input);return 0;
}

将转移表的代码加入回调函数:

void menu()
{printf("*************************************************\n");printf("*************************************************\n");printf("*******1.Add    2.Sub    3.Div      4.Mul********\n");printf("********************0.退出***********************\n");printf("*************************************************\n");
}int Add(int x,int y)
{return x + y;
}int Sub(int x,int y)
{return x - y;
}int Div(int x,int y)
{return x / y;
}int Mul(int x,int y)
{return x * y;
}void Cals(int(*p)(int,int))
{int x=0;int y=0;printf("请输入两个参数:");scanf("%d %d",&x,&y);int ret = p(x,y);printf("%d\n",ret);
}int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d",&input);switch (input){case 1:Cals(Add);break;case 2:Cals(Sub);break;case 3:Cals(Div);break;case 4:Cals(Mul);break;case 0:printf("退出\n");break;default:printf("请重新输入");break;}} while (input);return 0;
}

qsort函数

qsort函数声明

 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
  • void*base,指向要排序的数组的第一个元素的指针。
  • size_t nitems 指向的数组的元素个数。
  • size_t size 指向的数组的大小。
  • int(compar)(const voidconst void) 用来比较两个数的函数。

这里我们用qsort函数来排序一个整型数组:

int com_int(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}int main()
{int a[10] = {2,1,4,3,6,8,9,3,1,10};int sz = sizeof(a) / sizeof(a[0]);qsort(a, sz, sizeof(a[0]), com_int);for (int i=0;i<10;i++){printf("%d ",a[i]);}return 0;
}

在这里插入图片描述

用qsort函数排序一个字符数组:

char cmp_char(const void*a,const void*b)
{return *(char*)a - *(char*)b;
}
int main()
{char a[] = {'w','d','q','v','e'};int sz = sizeof(a) / sizeof(a[0]);qsort(a,sz,sizeof(a[0]),cmp_char );for (int i=0;i<sz;i++){printf("%c ",a[i]);}return 0;
}

在这里插入图片描述
用qsort函数排序一个浮点型数组:
排序浮点型需要注意:不能想整型那样通过相减来判断大小,要用三目操作符。

int cmp_double(const void*a,const void*b)
{return *(double*)a > *(double*)b ? 1 : 0;
}
int main()
{double a[] = {1.2,3.1,4.2,9.6,3.1,5.5};int sz = sizeof(a) / sizeof(a[0]);qsort(a,sz,sizeof(a[0]),cmp_double );for (int i=0;i<sz;i++){printf("%lf ",a[i]);}return 0;
}

在这里插入图片描述
用qsort函数排序一个字符串:

int cmp_char(const void*str,const void*str1)
{return strcmp(*(char**)str , *(char**)str1 );
}int main()
{char* a[] = { "aaa" ,"fff","eee","bbb"};int sz = sizeof(a) / sizeof(a[0]);qsort(a,sz,sizeof(a[0]),cmp_char );for (int i=0;i<sz;i++){printf("%s ", a[i]);}return 0;
}

在这里插入图片描述

冒泡排序模拟实现qsort函数

#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
void _swap(void* p1, void* p2, int size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){_swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(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;
}

这篇关于【c语言】了解指针,爱上指针(5)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003144

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

利用结构体作为函数参数时结构体指针的定义

在利用结构体作为函数的参数进行传递时,容易犯的一个错误是将一个野指针传给函数导致错误。 #include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10typedef struct {int r[MAXSIZE]; //用于存储要排序的数组,r[0]作为哨兵或者临时变量int length;

【LinuxC语言】select轮询

文章目录 前言select函数详解selectfd_set类型一个小问题select函数使用步骤改进服务器代码select服务器示例代码 总结 前言 在Linux C语言编程中,我们经常需要处理多个I/O操作。然而,如果我们为每个I/O操作创建一个线程,那么当I/O操作数量增加时,线程管理将变得复杂且效率低下。这就是我们需要select轮询的地方。select是一种高效的I/

@ControllerAdvice:你可以没用过,但是不能不了解

1.概述 最近在梳理Spring MVC相关扩展点时发现了@ControllerAdvice这个注解,用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用 @ControllerAdvice,可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理,从而减少代码重复,提升代码的可维护性。 定义如下 /*** Specialization of {@link Component @

拓扑排序——C语言

拓扑排序(Topological Sorting)是一种用于有向无环图(DAG)的排序算法,其输出是图中所有顶点的线性排序,使得对于每条有向边 (u, v),顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件和终止事件,也就是顶点的执行顺序。         因为是有向无环图,所以拓扑排序的作用其实就是把先发生的排序在前面,后发生的排序到后面。 例如现在我们有一个

OC和 C语言中的const

const与宏对比 1.都是在其他的地方不可以改变 2.一个地方改了其他的地方都会改变。 而且宏定义的缺陷是, 是它会不断的开辟临时变量的存储空间 使用const的话 是都去使用同一的一份空间,使用同一个对象。 加const 之后变量还是全局的,只不过变为全局常量。 如果此时改变量不想被被类外面访问的话,可以加上static关键字, 3.下次想要定义一些宏的时候分