指针习题讲解

1. 回调函数

回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调用的函数就是回调函数。

我们来正常生成一个计算机程序来观察一下

你会发现这其中有很多相似的步骤就比如每个case中的的语句,只是调用的函数不同而已,我们刚学了函数指针数组,这时你们就可能会想到利用函数指针数组来访问函数,回调函数就是函数指针的一种非常重要的应用, 这里就会问了,不是函数指针数组吗?为什么说是函数指针呢?函数指针数组是多个函数指针放在同一个数组中,本质也是函数指针,而且回调函数也能使用函数指针来实现。

函数指针数组:

上次那个函数指针数组的使用格式也叫做转移表,通过函数指针数组来回调函数,简化了调用函数的过程。

函数指针:

用函数指针调用,则只需要在case中调用指针函数,将函数传地址的方式通过函数指针来调用函数。

2. qsort使用

qsort是个库函数可以直接使用,用于对数据进行排序的,是基于快速排序的思想进行排序的,我们之前学过一个冒泡排序,冒泡排序是一种排序方法,快速排序也是一种方法,一般不要求我们写冒泡排序我们一般都是使用qsort,而且qsort是什么数据类型都能接收的。

并不是qsort按照自己的方式来进行比较,而是你需要传入比较函数指针来进行比较。对于函数指针也不是没有要求的:

我们可以通过这个速记口诀来记忆。

我们生成一个比较函数来试试怎么用:

这里注意一下,头文件stdlib.h千万不要忘记了,qsort中的各个条件一定要记住,学好一文编程语言最重要的就是语法,这个求元素个数的放到外面就更好看出来了。

3. 指针运算笔试题

3.1 习题1

这里的重点就是(&a+1)我们之前说过&数组名==整个数组的地址,+1就是加了一整个数组的大小,因为整个数组的地址和首元素的地址是一样的,所以我们加一整个数组的地址就直接跳到数组a的下一块内存地址,强制类型转换后,(ptr-1)实际上是减了一个int的空间,也就是a4所指向的地址,解引用之后就是5;(a+1)这个难度不高,我们之前就着重强调过数组名就是首元素的地址 ,现在+1就是加一个元素的空间,就是a1的地址,解引用就是2。

3.2 习题2

这里是考察逗号表达式,因为这里是小括号所以其实a中的元素就只有3个,分别为1,3,5;p=a0代表二维数组第 0 行首元素地址,等价于&a00,赋值给int *p,也就是1。

3.3 习题3

这里主要考察二维数组的数组名,二位数组的数组名指的是第一行元素的地址,ptr1就是正常的整个数组的地址,上一题一样的思路,我们重点讲一下ptr2;aa指的是第一行元素的地址,+1则跳过一行元素的空间,*(aa+1)=aa10,指的就是第二行元素的首元素,(ptr2-1)指向的就是5对应的空间。

3.4 习题4

这主要考察的是二级指针,二级指针pa指向*a对应的空间,这样你可能有点难看出来,其实你将字符指针数组的语法套进去你会发现还是很好看懂的,pa=a0,这里我们需要注意一定,pa指向的是a0中首元素的地址,只是因为是使用%s打印,%s拿到字符起始地址后就会一直往后打印,知道遇到\0,并不是只打印一个字符。

4. 总结

我们通过习题可以深程度的了解指针的使用方式,也方便我们巩固一些知识点,你们在其他时间也需要通过刷题来查漏补缺,相信你们可以将指针学透!

相关推荐
Navigator_Z9 小时前
LeetCode //C - 1288. Remove Covered Intervals
c语言·算法·leetcode
铅笔小新z11 小时前
【C语言】深入理解指针
c语言·开发语言
Aurorar0rua17 小时前
CS50 x 2024 Notes Data structures - 08
c语言·开发语言·学习方法
小米里的大麦18 小时前
19 C、C++ 操作 MySQL
c语言·c++·mysql
Logic10118 小时前
C语言/数据结构位运算题解:异或XOR找出套碗游戏中的“幸运碗“——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
番茄灭世神18 小时前
PN学堂GD32教程第12篇——SPI与Nor Flash
c语言·stm32·单片机·嵌入式·gd32·总线协议
苏辰澈19 小时前
C++独属于自己的变身:多态
c语言·开发语言·c++·visualstudio·编辑器
水饺编程19 小时前
第1章,[Win32 章节]:在 VS2019 里面安装 MSDN
c语言·c++·windows·visual studio
水饺编程19 小时前
第1章,[Win32 章节]:编程环境与 MSDN
c语言·c++·windows·visual studio
wuminyu1 天前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++