小白是如何学习指针的(五)

世界是我们的!!        伟人如是说

在前面几篇博客已经将大部分指针的理论知识介绍了(当然只是初阶的),这篇博客将用几个程序来进一步强化我们对指针的了解。

1.qsort函数的认识

在此之中我们可能对于最后一个参数还是不太清楚,我们知道他是一个函数指针类型,但这个参数为什么是const void*呢?我们接下来通过两个程序来回答这个问题

比较整数

比较结构体

通过这两个例子,我们可以知道cmp函数中的参数设置为const void*的原因就是为了使这个函数的接口可以匹配不同类型功能,如果我们给定了类型,那么我们传参时只能传对应类型的变量,那么我们也就只能实现指定的一种功能,而我们这里可以传不同的变量,通过强转实现了不同功能的使用。

我们接下来来改造冒泡排序,让它能够排序任何算法(qsort函数的实现涉及数据结构的内容,较为复杂,不易讲解)

我们先了解了解它的大致过程,冒泡排序的核心便是两两比较,将最大(最小)放到一轮的最后,再进行下一轮的排序,但我们上述交换的内容显然不符合我们的要求,因为变量可能是其它类型,而这里我们使用中间变量是一个特定的类型即整形,这样我们只能完成整形的排序,并且我们比较大小的方法也是不符合的,我们知道>运算符只能比较整形,因此我们要考虑考虑我们上面给定的形参(我们现在才用到sz),接下来我们一步一步解决这些问题(难点)

比较arr[j] 和 arr[j+1]

我们知道cmp的参数是两个函数指针,既然是指针就说明这里我们需要传地址,但我们可能会产生一个疑惑,为什么传地址就可以进行比较呢?

我们拿这个函数(比较整数)来看,这里我们对p1和p2进行强转

我们知道在计算机中,顺序表是连续存储的,在这里我们已经知道顺序表首元素的地址(base),也知道顺序表中存储变量的大小(width),这样我们就可以得到每一个元素(如上图)并且将他们进行比较(这里是返回它们的差值),比较字符串的例子也一样,不过是使用strcmp函数来比较罢了。

交换两个元素

我们在交换时的难点在于不清楚变量的类型,无法直接给定一个特定类型的中间变量,这里我们有一种方法可以越过这一点,直接交换内存单元上的数据,char*类型只会访问一个字节内容,因此在交换变量内容中需要知道宽度,将一个变量中所有内容都交换,当然这里和上面比较时取内存略有差异,我们拿结构体比较的函数来看

上面这里只取了结构结构体的一部分进行比较,而我们交换内存时将整个元素(width大小内存单元)进行了交换(下面这张图具体内存单元未计算)

我们来看看个程序

我们在使用时会发现实现的功能与qsort函数一致(效率有差异)

结语:

至此,我们的指针系列结束了,希望这些博客能有助于你们加深对于指针的理解,当然由于作者也是小白,博客中不可避免会出现一些错误,希望大家能够带着思考去学习并指出这些问题。最后祝愿每一个努力之人都可以实现自己的理想!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C语言对于初学者来说,可以按照以下步骤来进行: 1. **理解基础知识**:开始之前,了解计算机基本概念如内存、数据类型、变量等。了解计算机是如何运作的以及C语言的基本结构是很重要的。 2. **选择教程或资源**:选择一本适合初学者的C语言教材,例如 "C Programming: A Modern Approach" 或者在线资源如C语言官方文档和Codecademy的教程。 3. **环境配置**:安装一个C编译器,比如GCC(GNU Compiler Collection),并学会使用文本编辑器(如Notepad++或Visual Studio Code)编写和运行C代码。 4. **语法入门**:从C语言的基础语法开始,比如变量声明、数据类型(如整型、浮点型、字符型)、运算符、控制结构(条件语句和循环)等。 5. **练习编写小程序**:通过编写简单的程序,如计算器、猜数字游戏等,来加深对语言的理解和实践。 6. **函数和数组**:学习函数的定义、调用以及数组的使用,这是C程序组织的关键。 7. **面向对象编程**:尽管C不是纯面向对象的语言,但理解指针和结构体,以及函数指针能让你接触到面向对象的元素。 8. **错误处理和输入输出**:学习如何处理程序中的错误,以及标准输入输出(如scanf和printf)的使用。 9. **阅读他人代码**:找一些开源项目来阅读,这有助于理解实际开发中C语言的应用。 10. **持续学习和实践**:编程是实践出真知,多做项目,不断调试和优化代码,逐渐提升编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值