2-2 野指针
1.不对指针进行初始化
如图
2.越界访问
如图
当p指针越界到数组之外是p就为野指针
3.
当指针访问的内存被销毁
如图
我们的p指针接收并保存了函数返回的a的地址但是在我们后续使用p时a的地址已经被摧毁了所以在后续使用时我们p指针的内容不在收到保护就会发生变化
从而我们的p就变成了野指针。
避免野指针
如果我们明确知道这个指针为野指针我们可以通过对其赋值为NULL(意为空指针),当我们知道他为空指针时我们就可以用if语句来避免野指针的使用
如
这样我们在使用指针的时候就可以不用提心吊胆的想有没有野指针了(只要程序中的野指针被赋值为NULL)。或者不想用之前用的指针的时候也可以将其赋值为NULL。
两个地址相减
前提条件:两个指针指向同一块空间。即两个元素之间的内存是连续的。
两个地址相减的绝对值是他们之间的元素个数
如图
他们地址相减的绝对值就是地址之间元素的个数。地址位于元素头部
——————————————————————————————————————————————————————
无关内容 (并不重要)
*(在标准中我们在使用指针时可以向后适当进行赋值和比较但不允许向前这样)
原话:
此内容并不重要
——————————————————————————————————————————————————————
指针和数组
因为数组内存存放的连续性所以指针和数组总是会有许多挂钩
下图我们可以看出 &arr[i] 和p+i和&p[i]等价都指向同一块内存
p[i] 和arr[i]也是等价的在被编译的时候都会先被编译成*(p+i)的形势所以两者也是等价的。
多级指针
(因本人也是菜鸡一枚所以多级指针咱只讲建立多级指针和多级指针是啥如何使用此篇文章没有讲述)
——————————————————————————————————————————————————————
先上图
(我们都以整型指针为例子进行讲述)
一级指针我们用int* pa 来创建二级则用int** ppa 来创建其他则类似。
当然一级指针存放的是变量地址二级指针则存放的是一级指针的内存地址
如果我们想解引用二级指针来找到我们变量的内容我们只需使用两次解引用操作符
如图
我们依旧通过二级指针对a进行了改变。
当然多级指针肯定有更大的用途我会在不就的将来更新出来。
指针数组
类似于整型数组之类的指针数组依旧是数组的一种形式
指针数组就是用来储存指针的数组。
当然我们可以看到指针数组并没有被完全定义后面的指针就为空指针及NULL指针不能被访问。