本章重点
1. 指针是什么
2. 指针和指针类型
3. 野指针
4. 指针运算
5. 指针和数组
6. 二级指针
7. 指针数组
今天我们讲解前4个稍微简单一点的内容,下一篇博客讲解后三部分
首先引入话题
我们口语讲到指针,比如p指针,其实想要表达的意思就是p是一个指针变量
取地址操作符&a取出a的地址,看上图代码
给大家画个图让大家初步认识一下学习指针需要用到的基本理论
32位机器上我们有32根物理电线,32根地址线通电后产生的电信号转化为数字信号,随机产生0 1组成的这样的二进制随机序列,一共有2的32次方个全0到全1的二进制序列
2的32次方个字节,每个地址标识一个字节,那我们就可以给2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB,在32位机器上最多能寻址(或者管理)4GB的空间,至于64位机器,大家参照32位机器的计算方式可以自己计算一下
在64位机器上,64个比特位就能存放64个01组成二进制数
指针变量是用来存放地址的,地址是唯一标示一个内存单元的
指针的大小在32位平台是4个字节,在64位平台是8个字节
下面指针类型的讲解,大家先别慌,先跟我的思路走,看下图
在X86环境下,打印的指针大小都是4个字节
在X64环境下,打印的指针大小都是8个字节
我们按住F10调试起来看到a在内存中的存储是倒着存放的,为什么呢,大家可以先不管,如果感兴趣,可以去我的数据在内存中的存储那两篇博客中去看一下,不懂的可以在评论区提问
下图是按住F10调试起来给大家有一些疑惑的地方做了一些注释,希望大家能够理解
我们将*pa赋值为0,可以看出全部改成了0
当我们把指针类型改成了字符指针,大家有没有发现我们只修改了1个字节,这是为什么呢?
这是因为指针类型决定了解引用操作的权限,看下图
下面给大家讲解指针+-整数
指针+-一的细节已经给出大家代码和讲解了,希望大家能够理解
下面是一个很有意思的知识点:野指针
概念:野指针就是指针指向的位置是不可知的 随机的 不正确的 没有明确限制的
野指针第一种情况
指针未初始化
野指针第二种情况
指针越界访问
当P指向超过数组范围的位置时,P就已经越界访问了,这就是第二钟野指针的情况
第三种情况
局部变量的作用域进入函数创建,出来函数就销毁,但是return &a把a的地址带回去了,*p又去访问,则就是非法访问
我们必须对指针进行严格地初始化,养成良好的代码习惯
例如,指针p使用完了之后需将其置为NULL(空)
接下来是第四个部分
指针的第一种和第二种运算已经给大家画出图了,大家自行阅读,理解起来还是比较容易
最后一种运算
对比简化前的代码简化后的代码,大家对比起来看,第二种代码就发生了错误
本章终,希望大家多多支持,下一博客我们讲解后面3个部分的知识,大家先复习一下前面讲过的知识