在前几期的野指针篇章中我说了野指针的几种常见的情况以及什么是野指针,没看过的兄弟们可以看看前几期的视频。感谢兄弟们支持!!!那么话又说回来又该如何去避免野指针呢?以及我们要介绍的指针的加减法。
一.如何避免野指针
1.指针的初始化
放创建出一个指针时如果暂时没有想好或者是还没有放的内容时可以先将指针赋予NULL。例如
int* p=NULL;
这时即使是没有想好p里面放的内容也不会出现野指针的情况。
2.小心指针越界
这种情况一般出现在循环里面的情况比较多,只要在写的时候小心超出数组所占内存的大小,在不知道需要数组需要多大的内存时可以将数组的内存赋予一个很大的数,这样就不会担心指针越界了。
3.指针指向空间释放
指针使用完之后可以将指针赋予NULL及当完成了一个指针的操作不需要再将这个指针指向一个地址了这时可以将这个指针赋予NULL。这样就可以避免空指针了。
4.指针使用之前检查有效性
前面如果我们养成了良好的习惯对于刚创建的指针给他赋予了NULL或者用完之后赋予了NULL则这时候我们就可以判断一下这个指针有没有在使用,就像这样
int*p=NULL; if(p!=NULL)操作步骤;
这样我们就很好的避免了使用正在使用的指针而导致前面代码的崩溃。
ok了关于如何避免空指针也写的差不多了,接下来该来到我们的重点了“指针的加减运算”
二.指针的加减运算
加减法的原理
关于指针的加减运算可能会有一些没有接触到的兄弟们比较懵。指针不是指向的是地址吗?地址怎么还能加减运算呢?指针+1是加什么加多少-1又是减什么减多少?没得事下面我来给大家讲一下。
首先是第一个问题指针一个地址可以加减运算吗?答案肯定是肯定的当然可以,那么他是怎么加的呢下面一格简单的代码给大家解释一下:
#include<stdio.h>
int main()
{
int a = 1;
int* p = &a;
printf("%p\n",p);
p++;
printf("%p\n", p);
return 0;
}
由代码的输出结果我们可以看出第一个数据比第一个数据多了4,那为什么是4呢?它为什么不是1为什么不是8呢?这加的完全是取决于我们的指针类型我们的代码中指针的类型是int而int的的大小为4个字节所以他加1也就是加了一个int的大小,当为char时就为1那double就是8了。下面我们再用一个代码证实一下我所说的:
#include<stdio.h>
int main()
{
char a = 1;
char* p = &a;
printf("%p\n",p);
p++;
printf("%p\n", p);
return 0;
}
看现在两个数就只相差1了吧!
那么我们学会了加指针加减的原理我们就可以来写一下有实际意义的代码:
#include<stdio.h>
#include<string.h>
#define add 5
int main()
{
float arr[add] = { 1,2,3,4,5 };
float* p;
for ( p = &arr[0]; p <& arr[add];)
{
*p++ = 0;
}
return 0;
这样一个简单的代码就可以实现我们的代码初始化。
那么加法可以减法呢?那当然也算可行的了
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];
int* p1 = &arr[9];
printf("%d", p1 - p);
return 0;
}
其实数组内的指针相减就是arr【0】~arr【9】之间的元素个数。这里提一下指针相减是要在一个区域内并且有意义的如果让两个毫无相关的指针相减,额~。那样的可能就是不同的编译器上会产生不同的值吧。不过你们可以在自己的编译器上试一下。
OK了这就是指针加减法的一些知识了。下面给大家来一个它的运用代码吧
运用指针的实现自己的strlen函数
int my_strlen(char *p)
{
int count=0;
while (*p != '\0')
{
p++;
count++;
}
return count;
}
int My_strlen(char* str)
{
char* start = str;
char* end = str;
while (*str != '\0')
{
str++;
end++;
}
return end - start;
}
int main()
{
char arr[] = "welcome to my world ";
int len=my_strlen(arr);
int Len = My_strlen(arr);
printf("%d\n", len);
printf("%d\n", Len);
}
两种方法都可以哦,只不过第二种用了指针的减法。目的也算能让大家理解了。
感谢兄弟们的阅读,喜欢的可以一键三连谢谢啦!!!skr!skr!
下一篇给大家讲一下指针的比较!
拜拜!!!!