内容预告:
- 指针类型
- 野指针
- 指针的运算
- 二级指针
- 指针数组
指针是啥啊:
指针简单来说就是地址,比如我住在翻斗花园3栋301室,通过我告诉你的地址翻斗花园3栋301室,你可以找到我家。有没有发觉地址是有一种很强的指向属性的,指向我的家,找到了我,所以地址也就叫做指针。
官方解释:
指针是个变量,它是用来存放地址的;
指针类型:
我们观察int* char* float*为什么大小都是4个字节,好像是和指针的类型没关系;
但指针类型真的是没有意义的吗,如果没意义干嘛不定义一个通用的呢;
所以接下来我们来探讨一下指针类型的意义:
结论:
1.指针类型决定了:指针在解引用时的访问权限的大小。如果是int*类型的,解引用的大小就是访问4个字节,char*解引用的时候就是访问1个字节;
2.指针类型决定了指针走一步走多远(多远只得是步长);
指针类型的第一个含义:
我们可以看到这里a里面的全被内容变成0了;
int*的时候,解引用访问的是四个字节;
如果是char*在解引用的时候:
在这里我们只看到了44变成了00;
char*指针解引用的时候,解引用访问的是一个字节;
总结:指针类型发生了变化,访问权限就发生了变化;所以以后要想访问多少字节时,要注意指针类型的书写正确;
指针类型的第二个含义:
可以看到这两个不同类型的指针的地址是一样的;
如果我们都+1,会发生什么变化:
我们看到如果是整型指针+1,地址就加了4;
如果是字符指针+1,地址就加了1;
解释:如果是char*类型指针+1,其实就是跳过一个字符,也就是1个字节
如果是int*类型的指针+1,其实是跳过一个整型,也就是4个字节;
野指针?能有多野
出现野指针的情况:
- 指针没有初始化
- 指针越界访问
- 指针指向的空间释放了
1.指针没有初始化
vs2019下的错误提示:
pa是局部的指针变量,相当于局部变量,局部变量不初始,他的值是一个随机值,在解引用时就是非法访问内存;
所以变量一定要初始化;
2.指针越界访问![](https://img-blog.csdnimg.cn/5310647d11ad47d4bf08cd74edb2f6f5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARmx5X3BpZzE=,size_20,color_FFFFFF,t_70,g_se,x_16)
访问第十次的时候超出了arr数组的10个元素,越界了。
3.指针指向的空间释放了
之前的内存你已经还给了内存,但可能指针记住了这个地址,如果在继续访问,就属于野指针;
解释:
这里进入main函数,调用了test函数,那就进入test函数去看看,创建了局部变量a,然后将这里拿到的a的地址返回出去,我们这里要注意了,既然返回出去了,也就是test函数创建的a生命周期到了,a的空间也就销毁了,还给了内存。这时候到int*p虽然是记住了这个地址,但是以前a变量的生命到了,他的内存空间还给了内存了,但是*p还继续解引用,这就属于野指针了。
那既然有了野指针这一说法,怎么避免呢?
1.指针初始化(初始化时不知道初始值,直接初始化为NULL)2.小心指针越界
3.指针指向的空间被释放时,使之置NULL
4.使用指针之前检查有效性
如果指针指向的是一个有效的地址,那就不用注意什么;
如果指针指向的是一个不明确的地址或者是指向一个被释放的一个表空间的时候,将它置为空指针NULL;
这样的话,指针只有两种情况了,一种是明确的有效的地址,另一种就是空指针(NILL)。
指针的运算:
- 加减整数
- 指针-指针(指针减去指针得到的是两指针之间元素的个数)
指针-指针的前提是指向相同的空间
- 指针的关系运算
比较以下两个代码,看似他们实现的功能是一样的,都没什么错误
第一种代码:
第二种代码:
但是
虽然第二种看似也完成了同样的任务,然而要避免,因为标准并不保证它可行。
标准规定:
上面那句话的意思就是:
指针从小到大的方向走,即便指针超过了也是允许的
但是如果从地址的大到地址小的方向走,指针会超过这是不允许的;
所以最好保证指针是从左向右指向;
指针与数组:
从上图得到的结论:数组名就是数组首元素的地址
从这程序我们看到
arr[0]和*(pa+0)访问到的都是0;
那我们猜测
arr[2] <==> *(pa+2) <==> *(2+pa)
因为这个:
arr数组名表示首元素的地址,赋值给pa(这里的pa不是一个普通的变量,是一个整型类型的指针)不就可以简单的认为pa就是arr嘛。
arr[2] <==> *(pa+2) <==> *(2+pa) <==> *(2+arr) <==> 2[arr]
arr[2] <==> p[2]
二级指针(简单认识)
指针数组(简单认识)
最后的最后,创作不易!看完觉得作者写的博客对你有一定帮助,一定要记得一键三连哦!
如果有错的地方也希望大佬指正出来,欢迎大家来评论交流!与大家一起学习进步!
下期再见哦~
————————————————