初级指针

初级指针

初级指针
指针是什么
指针和指针类型
野指针
指针运算
指针和数组
二级指针
指针数组

一.指针是什么?

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

(指针就是个变量,变量里存的是内存单元的地址)

1.内存

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

2.代码

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

3.地址

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

4.总结

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

二.指针和指针类型

1.指针类型的大小

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

指针类型大小在32位操作系统是4个字节,在64位操作系统是8个字节,虽然他们大小相同,但都具有各自的实际意义,下面来探讨一下。

2.指针的实际意义

①指针的解引用

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

可以看出不管是什么类型的指针,都可以很好的把a的地址存起来,但因为a的地址是int型,此处会报警告,但仍可以把地址存起来。

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

接下来我们在窗口监视a的地址,让指针pa的地址变为0

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

(此时内存是倒着存放的,这里我们先不作讲解)

然后我们下一步,看a的地址如何变化

!](https://img-blog.csdnimg.cn/20201106214313738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pbmdyZW5fMTMxNA==,size_16,color_FFFFFF,t_70#pic_center)

可以明显看出,a的地址全部变为0。实际是a的地址存在指针pa里,指针pa为0后,a的地址变为0。

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

下面再看一下字符指针

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

在窗口里监视a的地址,运行后观察地址变化

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

由此可以看出,指针有自己的意义,虽然都可以存放地址,但是在进行解引用时有自己的特点。即指针类型决定了指针进行解引用操作时,能够访问空间的大小。(访问字节的大小)

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

②指针±整数

在这里插入图片描述

可以看出指针类型决定了指针+1向后跳几个字节

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

下面我们用代码研究一下他们的实际意义

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

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

把该数组元素全改为1

那么char类型的指针可以吗

这里的数组有十个元素,即有40个字节,int类型指针一次可以修改一个整数元素即四个字节,而char类型一次修改一个字节,所以char类型只把两个半字节改为1

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

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

而int*可以把四十个字节全部修改

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

三.野指针

1.概念

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

2.成因

①指针未初始化

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

②指针越界访问

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

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

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

③指针指向的空间释放

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

解释一下这个程序:

创建一个test函数,返回a(10)的地址,指针p存储a(10)的地址,但是!当程序结束后,a的地址空间还给系统(空间释放),所以当你再次通过指针p(a的地址)找到这个空间时,你访问的这个空间已经不是这个程序的了。

3.如何规避野指针

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

下面看一个程序

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

运行后,可以正确的打印10

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

但是这个程序有很大的问题,细心的人运行程序后会发现,程序没报错,但会有一个警告

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

我们来讨论一下

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

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

程序运行,test函数起作用,临时变量a被赋值为0,但是当a的地址被返回后,此处的空间释放,所以当指针p再次访问这个空间时,没有任何意义,是非法的。

规避野指针的一个很好的方法可以置之为NULL ,在使用时检查其有效性。

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

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

可见当将一个指针置为NULL时,再去访问一个空间程序会崩溃

所以在使用时,可以先判断一下有效性再进行使用

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

四.指针运算

1.指针±整数

在这里插入图片描述

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

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

也可以倒着输出

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

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

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

2.指针-指针

指针-指针也就是地址-地址

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

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

可以看出指针-指针(地址-地址)得到的实际是两个指针之间元素的个数(ps:指针相减要用大的减去小的,否则会是负数)

有一个误区:

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

可以看出,指针相减必须指向同一块空间,否则会出错。

下面实用一下 使用指针-指针实现strlen求字符串长度

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

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

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

3.指针的关系运算

指针的关系运算也就是比较大小

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

前置–,所以vp先向前走一步,再解引用赋值为0,然后循环运行

接下来将这个代码进行简化

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

但是我们应避免第二种写法,因为标准并不代表它可行

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

来解释一下这个规定

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

假设现在有一个数组arr,p1是某个元素的地址,p2是最后一个元素后面那个元素的地址,p3是第一个元素前面那个地址。规定即允许p1与p2比较,但不允许p1与p3比较。

五.指针和数组

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

可以看出数组名表示的是首元素的地址,但并不是所有的数组名都表示首元素地址,有两个特殊情况

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

下面来讲解一下

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

可以看到第一行和第二行输出的是首元素地址,第三行输出的是整个数组的地址,但是为什么地址相同呢,该怎么理解呢

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

可以清晰看出,整个数组的地址也是从第一个元素开始,所以从数值上看是相同的,但是意义却不相同,下面来看一下

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

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

所以知道了之后,下面来进行实用

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

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

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

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

六.二级指针

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

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

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

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

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

七.指针数组

指针数组本质是个数组,数组指针本质上是指针

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

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

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

初级指针就介绍到这里,想继续学习可以看进阶指针,但要踏踏实实一步一步向前走,加油!


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值