序言:
在我写这篇文章的时候已经学过去指针好久了,第一次想要回来写指针这篇博客的时候是在学习单链表的时候,那个地方用到了二维指针,使我坚定的来写指针是在学栈和队列的时候,这时我就发现如果你的指针不能真真实实的理解清楚,等之后将会带来越来越大的影响。最终就写下了关于指针的一系列博客。
什么是指针:
什么是指针呢?当学到这里的时候都会说是地址,不可否认它们之间有很大的联系,但是仅仅理解这个是不够的,下面我将以我的理解来讲解一下指针,以及我当时遇到的问题。
写代码创建各种各样的变量是不可避免的,而每一个变量后面计算机是如何来找到这么多的变量,这就用到了地址。我举几个例子。
此时a 是创建的一个变量,后面调试的是a 的地址。
而地址可以用一个变量来保存--也就是指针变量--也就是说这个变量存的就是a的地址。
会发现p变量和&a的内容一摸一样。我们可以看一下内存空间。
会发现p的内容 和 &a的地址完全一样。总结来说就是存储变量地址的一种特殊的变量。
解引用操作符--*
当知道指针里面是有的各种地址,所以说可以通过地址来准确的来找到相对于的内容
也就是“ * ”如下
简单来说就是指针变量里面存这一些变量的地址,而解引用就是通过地址来找到了这个变量的内容,
指针的类型:
和普遍变量一样,指针也有各种的类型,那么问什么会存在各种类型呢,我认为的指针的类型代表这指向的数据类型,那么就有了如此多的指针类型了。
需要注意的是,正确的使用指针类型才可以更好的储存数据,错误的使用很可能会带来数据丢失等一些不可控的影响。
这有一个例子,铁子们可以看一下下。
指针的加减整数:
记住一句话,指针的加减整数只和该指针的类型有关,该指针的类型占几个字节就是一次加减几个字节。
void*指针
主要作用我现在了解太多数是在函数传参中用到,使用void类型的指针就可以传任意类型的数据
看到这里发现指针如此重要那么就存在一些情况不能让它随意的更改。
const修饰指针
这里分为两种情况
a = 20;
指针 例: int * p = &a;
其一;
int const * p = &a;
这种情况 *p不能修改--也就是说这个解引用的值是不能改的,但是p 的指向是可以改变的
其二;
int * const p = &a;
这种情况p 的指向是不能改变的,但是指向的值可以改变。
通过这两种情况就会发现指针两部分控制本身指针变量,已经指向的数据。只有控制好了这两种情况才能完全控制好指针。
例子
指针的运算
指针加减整数
前文已经具体的讲解过啦,这里就不多说啦
指针-指针
记住啦,指针减指针就是它们相差的数据个数。
指针的关系运算
通俗来说也就是比大小,地址本质上来说数嘛,所以也就是数比较大小。
野指针
简单理解就是控制不了的指针--指向随机的指针
出现的原因通常有;
指针没有初始化
指针加减越界
指针指向释放的空间
解决办法:
指针初始化
避免越界的指针
释放的空间,指针要及时值空