关于指针的一些理解(1)

本文详细解释了指针的基础概念,包括内存地址、指针变量、解引用操作,以及不同类型的指针(如int*、void*、const)的特性。还讨论了野指针的产生原因及预防方法,强调了指针初始化和正确使用的必要性。
摘要由CSDN通过智能技术生成

首先要理解指针那就一定离不开内存和地址,首先内存划分为一个个内存单元,每个内存单元的大小取一个字节,而一个字节可以取八个bit位,里面可以存放二进制的一或零,而有了这八个bit位,就可以形成一个编号,有了这个编号也就相当于有了一个地址了,这样就可以快速查找了,所以我们可以理解了

内存单元的编号 == 地址 == 指针

然后就是指针变量和地址,学指针的话肯定少不了地址操作符(&),而我们通常用地址操作符去取的地址需要存放,存放的地方就叫做指针变量。

解引⽤操作符(*)以及如何理解拆解指针类型

首先我们看第六行代码里面,int *p,里面(*)指明了p是一个指针类型,而它指向的对象是int型;

运行结果如下;

而当我们里面的p存放了a的地址,那么又该如何使用呢?这时候我们就该用解引用操作符(*),通过去解引用p里面的地址,去找到a的值。

当我们进行这几行代码时可以发现,对p的地址解引用的值赋给c,以及直接打印的值是一样的;

指针变量的大小

这里方便的话还是可以去直接去记住结论

32位平台下的地址是32个bit位,指针变量大小是4个字节;

64位平台下的地址是64个bit位,指针变量大小是8个字节;

指针变量大小与其指向的类型无关,而是与它们的平台有关,相同的平台,指针变量大小是一样的;

输出结果就是

接下来看32位平台下的

这也就说明了指针变量大小与指向的对象类型大小无关,而是与其所在的平台有关。

指针+-整数

对于指针加减整数,刚开始学的时候我也很害怕,觉得地址这玩意还能加减?后面经过了学习才发现其实也没有那么困难了

由这几行代码我们可以发现p1和p1+1的地址相差4,而p2与p2+1却相差1,这也就可以看出,p1与p2两者的差距也就是指向的那个类型不相同才会导致加一的值不相同,我们可以看出char*类型的加一跳过一个字节,而int*类型的加一跳过了四个字节。

结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。

void*指针

void*指针是是一种特殊的类型指针,这种类型的指针可以接受任何类型的指针。但是也有局限性,就是它不能进行指针的加减整数以及解引用的运算。

const修饰指针

const这个是用来固定一个值的,使这个值不能去修改,这就是const的值的作用。

很显然,n的值可以被修改,而a的值一修改就开始报错,这就是const的作用。

const修饰指针变量

一般来讲const可以放在*左边,也可以放在*右边,但是这两者情况也是不一样的

接下来,我们就来分析这三种情况,

可以看到,当const在*的右边时,我们对p指针去修改时,发现报错了,而对p进行解引用时,却可以对其a进行修改值,由此可以得出,当const在*右边时,修饰的是p,所以p的值是不可以去进行修改的

而当我们去将const放在*的左边时,*p却发生了报错,反而p的地址却可以修改了,由此可以得出,当const放在*的左边时,则*p的值不能修改

指针运算

指针加减整数

首先我们来看这段代码,里面的p获得了arr数组的首元素的地址,任何通过循环使p这个指针进行加减,可以打印出整个数组。

野指针

首先我们要了解野指针的概念

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
变成野指针的原因有三种,分别为指针未初始化、指针越界访问、指针指向的空间释放。

接下来,我们来看第一种,可以看到我们通常的指针表达式是int *p = 地址,但倘若我们未给p这个指针赋上地址,又会发生什么变化呢?

很明显,我们这里是发生报错了的,原因就是未初始化,导致成为野指针。

接下来我们来看第二种

可以看到,当我们的i为10,与指针p相加时,此时访问的就是数组的第十一个元素,但我们的数组的并没有11个元素,此时就发生了指针越界访问;

然后就是第三种了

当我们的test函数结束时,test这个函数的临时空间也就关闭了,而n的值也就没有了,自然这个n的地址也就不存在了。

如何防止野指针的出现

对于防止野指针的出现,就是要及时的给指针赋上NULL这个空指针,并且重新给p赋上一个初始值,然后用if来判断这个指针的地址。

ok了,这就是指针我对指针的一点理解了,如果有错误,欢迎大家来指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值