进阶指针

进阶指针

进阶指针
字符指针
指针数组
数组指针
数组传参和指针传参
函数指针
函数指针数组
指向函数指针数组的指针
回调函数
指针和数组面试题的解析

字符指针

概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ixpwO5or-1604931815938)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604731314126.png)]

还有另外一种用法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4QFi8pGp-1604931815939)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604731397354.png)]

还有第三种写法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ix05Qffc-1604931815940)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604731585986.png)]

但注意不是把字符串“abcdef”赋给p,而是把字符串首元素a的地址赋给p

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95EMcgGC-1604931815942)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604731771090.png)]

我们知道p存的是a的地址,那么可不可以更改a呢,如下

**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LaBMb7sO-1604931815943)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604731856495.png)]**

注意:可能vs较老版本可以编译成功并输出Wbcdef,但这是完全错误的,这里先不做具体讲解。

实例

下面我们来看一个程序来更清楚的了解一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLXRqMIM-1604931815944)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604732349428.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJmblpVr-1604931815945)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604732400225.png)]

为什么会输出haha呢,我们来分析一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiuxBLQs-1604931815945)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604732743271.png)]

再看一下下面这个程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dCXn5Kx-1604931815946)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604732793802.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hPmEp3I-1604931815946)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604732920849.png)]

那为什么这个打印hehe呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U29T1ava-1604931815947)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604733212139.png)]

指针数组

指针数组其实是数组,指针只是对这个数组的修饰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IPw5Hc1-1604931815947)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735105724.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHRYYZpF-1604931815948)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735185737.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XXKTGHZz-1604931815948)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735260664.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hsWNATk-1604931815948)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735237048.png)]

数组指针

概念

数组指针是指针,数组只是对他的修饰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XXKIHZiH-1604931815949)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735534432.png)]

下面举个例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2J1T4Mlp-1604931815949)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735720648.png)]

*p一定要用括号括起来,但在定义变量,并不是解引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPs7LlIM-1604931815949)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604735762056.png)]

下面看一个程序更清晰的了解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJ87YOnq-1604931815950)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604736372594.png)]

实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3IQLKcf-1604931815950)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604736826896.png)]

或第二种写法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0WVSn30-1604931815950)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604736985431.png)]

但事实上,这里用数组指针完全自找麻烦,可以用简单的方法解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRYW6ldq-1604931815951)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604737244095.png)]

所以说,数组指针可以这样用,但并不方便使用,事实上在二维数组以上才方便,下面举个例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcnT3Xbv-1604931815951)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604737888384.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OnRQ8SEb-1604931815952)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604737920615.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3bjLt9c-1604931815952)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604738037199.png)]

下面我们再用数组指针的方法(参数是指针的方式)来看一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zs54s3Qc-1604931815953)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604738127400.png)]

事实上,上面的*((p+i)+j)可以写成*((p+i)[j])

解释:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4T8uvSsj-1604931815954)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604739715574.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uP34E0Rj-1604931815954)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604739938562.png)]

这些输出都是一样的

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-grCDMhnH-1604931815954)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604740068062.png)]

那下面我们看一下下面的代码各自代表什么意思

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cz8SmQj0-1604931815955)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604740635886.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ov7808wO-1604931815955)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604740660645.png)]

下面对parr3画图直观的观察一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMdNdbKf-1604931815956)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604740760214.png)]

数组传参和指针传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaeHOvgj-1604931815956)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604819420676.png)]

一维数组传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lu73B2YB-1604931815956)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604819965766.png)]

二维数组传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61euktrz-1604931815957)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604821249076.png)]

这里注意,二维数组的地址是首元素的地址,就是第一行的地址,也就是一个一维数组的地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ych9L79Z-1604931815957)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604821433236.png)]

所以上面这两种传参方式是错误的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EbaesmYE-1604931815957)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604821695676.png)]

一维指针传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i2dbyK0c-1604931815958)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604821786420.png)]

下面看一个思考问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TR8egDGs-1604931815958)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604822017829.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ah9tnn8N-1604931815959)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604822630227.png)]

二级指针传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6almZBb-1604931815959)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604822686115.png)]

实际上数组也可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3QNmc8B-1604931815960)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604823059339.png)]

函数指针

概念

函数指针是指针,这个指针指向函数,是存放函数地址的指针

首先我们先定义一个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yUx61rcd-1604931815961)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604823823058.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPrL3wA1-1604931815961)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604823900019.png)]

注意这里有一个特殊的地方,就是&函数名和函数名都是函数的地址,函数没有首元素,所以这两个地址是相同的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEXLO2kB-1604931815961)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604823949162.png)]

调用函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wy09iYhW-1604931815962)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604824099306.png)]

但事实上,对于函数指针来说,p前面的*可有可无,因为我们把Add的地址赋给pa了,直接调用Add和pa效果是一样的,pa前的*写几个也都对编译结果没影响

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGx2CBMx-1604931815962)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604836755653.png)]

下面再看一个代码加深理解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZ8RzBnU-1604931815962)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604824412554.png)]

那么函数的地址应该怎么保存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQP9bNOx-1604931815963)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604824938613.png)]

拓展

下面再看两段有趣的代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uy4f5qFd-1604931815963)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604824992370.png)]

有兴趣的可以自己研究一下,这里不做讨论

函数指针数组

概念

函数指针数组是一个可以存放多个函数的地址的数组

下面用代码来直观了解,首先我们先定义一个函数实现加减乘除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LzRNllRG-1604931815963)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604837304208.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVL8l5Te-1604931815964)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604837351145.png)]

实例

1.初步了解使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLDB7xSj-1604931815965)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604837491384.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJfKj0l7-1604931815965)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604837680050.png)]

2.转移表(计算器)

首先打印一个菜单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaKirxBy-1604931815965)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604838708738.png)]

然后定义几个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j61BpjNu-1604931815965)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604838654768.png)]

然后写程序引用函数,使用函数指针数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeN2HPQS-1604931815965)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604838808399.png)]

指向函数指针数组的指针

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8M0drx41-1604931815966)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604843036690.png)]

回调函数

概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1zOtRoe-1604931815967)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604839127417.png)]

举例

1.计算机例子

以上面计算机的例子来看,先定义一个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNtxX6el-1604931815967)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604842783101.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQBCLNJ7-1604931815968)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604842897489.png)]

2.创建两个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJbUyAOH-1604931815968)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604887987249.png)]

打印后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R48mYZAk-1604931815968)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604888366162.png)]

3.冒号排序函数(qsort)

我们首先先回忆一下冒号排序,先定义一个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9bf82Tf-1604931815968)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604915314899.png)]

再调用函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70ukuLIt-1604931815969)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604915339863.png)]

大家对这个冒泡排序可能比较熟悉,但是很显然这种方法有一定的缺陷,就是他只能排序整数型的,那么下面我们用一个新的方法,可以排序各种类型—qsort函数

下面我们先了解一下这个qsort函数

首先这个qsort函数需要一个头文件#include<stdlib.h>

其次它需要四个参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRqDmg1J-1604931815970)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604920778650.png)]

那这四个参数分别是什么意思呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGVyI8tT-1604931815970)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604921038073.png)]

这里注意,在自己定义的函数参数比较时,要相减返回值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rAxZDSwQ-1604931815970)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604923337177.png)]

再补充一个知识点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVSB52Nq-1604931815971)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604921296200.png)]

了解后我们用qsort函数对上面的冒泡排序代码进行优化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qKKbHBHO-1604931815971)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604922117376.png)]

qsort的其中一大优势就是它可以比较各种类型,下面比较一下浮点型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSJlqhXu-1604931815972)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604922066008.png)]

那一个结构体也肯定可以比较,但是不能用大于小于号,而且首先我们要确定用结构体中的什么区别条件排序

比如我们先用年龄比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FCBloXF-1604931815972)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604922461097.png)]

再用名字比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bydPfbZw-1604931815972)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604923204657.png)]

那如果不知道类型怎么比较

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvDlAggX-1604931815973)(C:\Users\mingren\AppData\Roaming\Typora\typora-user-images\1604924293633.png)]

进阶指针的讲解就到这里,希望大家可以结合初级指针学习,掌握指针,指针是c的精华,学完后应多做面试题加深理解和应用,下面的博客中会介绍比较经典的面试题,希望大家可以互相学习指正错误互相进步。

坚持不懈脚踏实地才能成功,加油!


作者:吕文康
学校:山东第一医科大学
2020年11月9日

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值