1、野指针
A、什么是野指针
野指针产生的缘由有以下三种:指针变量未初始化、指针变量越界访问以及指针指向的空间被释放
a、指针变量未初始化
指针变量存放的是地址,若其未初始化,则存放的是一个随机值,即一个随机的地址,此时这个指针变量就成为一个野指针,对其的解引用操作是非法的
b、指针变量越界访问
这种情况存在于数组之中。
数组名代表的是数组首元素的地址,所以我们可以通过对指针变量解引用来访问数组。数组存在越界访问的问题,所以指针变量也会出现越界访问。而当指针指向对应数组之外的内存空间时,便成为了野指针。
当对i=10,即对p+10进行解引用操作时,其实就越界访问了,出现野指针的情况。
c、指针指向的空间被释放
我们看下面这个例子:
在test函数调用时,其向计算机内存申请4字节的空间用以变量c的存储。而在test函数调用后,这4字节的内存空间便被释放,但此时指针变量p中仍然存储着这块内存空间,即先前局部变量c的地址。在这种情况下,p即为野指针,对p的解引用为非法访问。
B、如何避免野指针
a、指针变量初始化
创建指针变量的同时便对其进行赋值,如果暂时想不到赋什么值,可以初始化为空指针。
b、避免指针越界访问
在使用指针变量对数组进行访问时,注意数组的界限,以免越界访问。
c、指针指向空间被释放时即置为空指针
对上图做如此处理,即可避免出现空指针。
2、指针运算
A、指针加减整数
指针变量加减整数,就是对地址进行移动,移动的字节数为相应指针变量所对应的步长。与数学中相同,地址加上正整数,地址增大;地址减去正整数,地址减小。
B、指针减去指针
指针减去指针的操作有限定条件:两个指针需指向同一块空间,这样指针才能相减,相减才有意义。因而指针相减多用于数组中,相减结果的绝对值为两个指针之间所含的元素个数。
显然,大地址减去小地址得到二者之间的元素个数;小地址减去大地址得到二者之间元素个数的相反数。
C、指针的关系运算
指针就是地址,地址本质上就是一个数值。因而指针的关系运算,本质上就是地址大小的比较。
上图应用到指针的关系运算来进行数组元素的打印。
需要特别注意的是,虽然这两种写法在VS编译器中都能正常运行,但后面一个for循环是存在问题的,严格来说,其中p>arr-1这个关系运算是不符合C语言标准的。
C语言标准规定,允许数组中元素的地址与数组后面那块内存空间所对应的地址进行比较,但不允许其与整个数组前面那块内存空间所对应的地址进行比较。这一点需要特别注意。