浅析指针及其应用

指针介绍

一般来说大家入门语言都是c语言,在我们学完如何将”hello world”打印在屏幕,学会了判断和循环语句,学会了一系列基础语法后,突然有一天遇到了个boss,它就是指针

其实理解指针并不难,觉得难是因为我们学着加减乘除,突然让我们求导。不知道这么说有没有引起共鸣,理解指针需要对计算机有个了解开始。

首先,我们先要了解程序运行时的情况。当一个程序在运行时,它的数据都存放在内存中,cpu需要从内存中读取数据进行运算,然后将运算完的结果放回内存,那么如果你是cpu,你怎么知道从哪里取数据呢?我们假设存放数据的内存是一个个小盒子,数据就在这些小盒子里面,如果我们要快速准确的找到我们要的数据,按照现实中的常识我们也能猜到应该对每个小盒子进行编号,之后我们就可以根据对应编号快速找到我们想要的数据了,这个编号在程序的世界里叫做指针。

经过上面的例子,你是不是开始对指针开始有了一些理解,肯定有人说了,你说的这个我都知道,但是为什么char类型的大小是一个字节,而char*类型的指针是4个字节呢,这个就要涉及到总线的概念了。我们前面也聊过了,程序运行时需要从内存中取数据,而这个通道就是总线了。这里稍微科普下,总线分为数据总线、控制总线以及地址总线。顾名思义,跟我们指针有关的就是地址总线了,既然是线,就是一根一根的,一般来说总线都是线排,每一根线对应一个bit(0/1),那么上面说的4字节就是对应了32根线了(1个字节是8bit),也就是我们所说的32位。我们有32根线肯定要都用上啊,所以指针就有4个字节来表示。

好了,上面说了这么多,其实总结下就是一句:指针就是数据存放的地址

数组

既然介绍完了指针,我们当然要聊一下它的应用,这里就说到了数组,有些人可能觉得这跟指针有什么关系,或者另一些人觉得数组不就是指针吗?对,也不对。

首先,先解释下数组跟指针有什么关系,既然我们上面说了指针就是数据,那么数组不就是多个数据的集合吗,既然是数据的集合,当然有自己的地址了,这里要知道的是数组中数据的地址是连续的,这个是个比较重要的地方,是我们可以顺序获取数据的关键。另外说下数组并不是指针,或者准确的说数组名不是指针,可以理解为是数组的首地址,是个常数,这里一定要清楚,他是不可变的,我们可以用a[2]取得数据,也可以用(a+2)取得数据,但一定要知道的是a并不是一个指针,也就是int \ a和int a[]的区别,知道这个,数组与指针的关系也就可以分得清楚了。

链表

链表跟数组最大的区别是数组的内存是顺序的,而链表是动态的,我们通过结点中的一个next指针,指向(即存着下个结点的地址)下个结点的形式形成一串类似链表一样的数据结构。

其他

理解了链表,其实栈和队列就很好理解了,只是不同形式的链表,先进先出还是先进后出都是表现形式而已,本质都是链表。

-------------本文结束,感谢您的阅读-------------