各位帅哥靓女们,猪猪又来写文章了(水文章),今天我们要说的就是c语言中被认知为最难的指针,为啥是最难,因为你把握不住啊。老规矩觉得猪猪写的还算不错的话,还请各位一件三连走起,如果猪猪写的有啥子问题,还请位于评论区斧正。
【一】何为指针?
啥是指针?当一个数据需要存入空间的时候,内存中会相应开辟空间,你总不能把数据直接丢进去直接完事,你需要记住把他丢哪里了,这样方便你下次去找到他。而你记录的就是地址,其实你类比于日常生活中是非常好理解的,如果有一天你住酒店了,这个时候我需要去找到你,你直接给我报你酒店的地址就行了,比如xx酒店xx栋xxx号,这个时候我就能轻而易举的找到你,地址也可以去类比,你就是数据,你所在的房间号就是地址,我可以通过这个地址去修改数据,这也就是房间门牌号可以不动,但是房间里面的人是可以换的,比如今天晚上住张三,明天晚上住李四,后天晚上住王五,int a=10;我后面可以将这个10改成20,后面我可以将这个数据改成30,但是我a的地址是不变的,用的一直都是一个地址。
【二】指针的大小
指针的大小通常是固定的,在32位的计算机上,指针的大小是四个字节,但是在64位的计算机上,指针的大小是八个字节的,有的人要问了,为啥是4个字节啊?在32个计算机上,存在32个地址线,那么会产生32个0 1序列,而32个0 1序列的大小就是四个字节,64位同理,存在64根地址线,64个0 1序列的大小也就是八个字节
【三】指针的类型
指针虽然大小是相同的,但是指针也是有类型的,指针指向的地址内存放的数据是int型的,那么这个指针就是int*型指针,如果指针指向的内部看见存的是char类型的数据,那么指针的类型的是char*~~~以此类推,指针指向的空间内部存放的是啥类型的数据,那么指针的类型只需要在这个类型的后面加上*就可,这个时候就有小可爱要问了,数据分为类型是因为数据的所需要的空间是不一样的,所以将这个数据分为了类型,但是为啥我的指针需要分类型,指针的大小不都是一样的吗?
【四】指针的取出
指针的去除是非常简单的,比如int a = 10;我需要a的地址,直接int* b=&a;即可这个时候我们b的内部存的就是a的地址。
【五】指针的使用
拿到地址之后你需要去更改这个地址内部的数据直接解引用就可,int a = 10; int* b=&a;
*p=20;这一行就可以把这个a的值改成20。
【六】指针的访问权限
上面就有小可爱问了一个问题,指针为啥要有类型?当时你和我说的指针大小是一样的,为啥不能用一个通用的方式去存储?宝,你只想到这个存储,但是你想到访问这个问题吗?计算机访问也是需要访问大小的啊,比如你printf的时候需要格式控制符,如果你用错了格式控制符,轻则输出错误,重则输出一堆你看不懂的错误,int*类型指针访问的时候访问的是四个字节的空间数据,但是char*类型的数据访问的只是一个字节空间的数据。所以你访问的只是一个字节的数据。
当你char*类型加1的时候跳过的是一个字节的空间,但是你int*类型加一的时候跳过的时候跳过的是四个字节的大小,修改空间数据的时候也是同理,你修改的空间是由你这个指针的类型的大小决定的。
【七】野指针
野指针的定义:简单来说,也就是你这个指针指向的空间不是应该指向的空间的同时,你还跑去访问这个空间。
同时类比一下住酒店,你给你的朋友发错了地址,你的好朋友跑去了别人的房间,就你说这件事犯法吗?这是私闯民宅了都,所以野指针就是违法的。
如何避免野指针?记住指针一定要初始化,因为指针不初始化所指向的空间是随机值,谁知道你跑到那个房间去了。
访问数据的时候小心指针越界,指针指向的空间使用结束后一定要去释放使他指向空,一定不要去返回局部变量的地址,因为局部变量使用之后就去销毁了,原本的空间被释放了,你i现在指向的空间被其他的数据重新利用了,所以谁也不知道你指向的是那个空间。
以上就是猪猪关于这期关于指针的全部理解了,老规矩觉得猪猪说的还是可以的话,麻烦给猪猪一件三连,猪猪爱你们~~~