指针这样学,你学会了吗?

263 阅读4分钟

C语言指针对于很多人来说都是一个令人头疼的难题,我认为这其中最关键的一点就是比喻对象找错了。

很多人在教什么是指针的时候,都会拿钥匙和房间做比喻,钥匙就是指针,而房间里面的东西就是数据。这样的比喻倒是没有错,可是为什么这么形象生动的比喻别人看了之后会更犯迷糊了呢?我认为这是因为钥匙和房间的比喻过于形象和具体了,缺少了中间的一些些思考过程,这就导致学习的人感觉更加的迷惑了。

那么该如何学习指针才能更直观呢?别急,让我来给你演示一遍你就会对指针一清二楚了。

内存长啥样

要解释指针,那首先要先搞明白内存,毕竟指针就是对内存的读写操作。

很多人在解释内存的时候总喜欢用房间来比喻,其实我觉得就把内存的真实姿态告诉大家会理解的更为方便。我们可以把内存想象成一个一维的线性数组,里面的元素只有0和1,从左往右依次排列,如下图一样。

bin-array.png

这样看起来是不是就清楚多了,接下来我们需要做一个分区操作,每8个元素一组区分开来,并做上编号,如下图。

bin-array_1.png

我们现在所使用的计算机几乎统一使用8bit作为最小的存储计量单元,一个8bit就等于1byte,因此上面才会按照8个元素一组进行分区,每个分区就是1byte,而每个分区的编号就是内存地址,所以第一个要点就是内存地址实际上是按照byte来计数的

虽然内存是一维线性数组,但是内存也实在是太大了,要是按照一维数组来分析内存数据的话实在太费眼力了,因此有人就将内存做成表格的形式输出,相当于把一维数组折叠显示了,本质上还是一维数组。

bindump.png

上图是一个可执行文件的二进制格式输出截图,最左边的是地址索引号,这里出现了字符,那可不是英文字母而是16进制的数字,你可以花5秒钟自己找找有什么规律。没错他们之间的差都是6,那为什么是6呢?来看中间一串二进制数字,已经按照8bit一组分好组了,每一行是6组,也就是6个8bit等于6byte,所以左边列差值为6就是每一行有6byte的意思。

这么输出的目的是为了计算地址的时候提供方便,比如我要找到内存地址28(十进制),那么从左边列中找到最接近28的数字0x18(左侧是16进制,换算成10进制就等于24),然后中间的表格从左往右数4,就能找到内存地址28了。

bindump_1.png

好了,到此你应该明白内存长什么样,并且知道什么是内存地址了吧,接下来就来讲讲什么是数据类型。

数据类型

接下来让我们来看看什么是数据类型,首先来一个提问,请你告诉我下面的图片表示什么意思呢?

pic_2.png

恐怕第一眼看到这串数字的时候是丈二和尚摸不着头脑,这都是啥意思呢?也许聪明的读者已经开始尝试用ASCII码来解读了,可是谁告诉你用ASCII码来解读呢?如果我说这是三个int类型的数字呢?又或者这是一个float类型的数字呢?我可没有说这一定是字符串呀!那继续看下面这张图。

pix_3.png

重点来了,如果我规定每8个数字为一个单位,每个单位表示一个整数,这个整数最小值为0最大值为255,是不是看着很眼熟?没错,这就是int类型!图中蓝色的框框我给取了一个名字"模版",有了"模版"后,只要把它往内存数据上一放,立刻就能解读出来内存数据的含义,如果我用16个数字为一组作为"模版",那我们就得到了long类型的模版。

有了"模版"这个概念之后,我们就能很轻松地理解什么是数据类型了,当我们明白了数据类型后,指针这个概念也就自然而然的出现了,那就是模版的位置就是指针!