写点什么

浅论指针(一)

用户头像
Integer
关注
发布于: 2021 年 03 月 30 日

对于经验丰富的行家而言,得心应手的工具在初学时的困难程度往往要超过那些容易上手的工具。

——《C 陷阱与缺陷》,〔美〕Andrew Koenig


前言


大家好,我是 Xeler,你们可以称呼我为夏尔(无情的玩梗机器)。

最近在 Bit 哥群里聊天吹水,一不小心嘴一瓢,吹下了写一篇指针文的牛皮。

开弓没有回头箭,只好写咯,于是便有了你们现在看到的这篇怪文章。

这个人写散文来的吧(小声 bb)

快加他微信骚扰他

前言

既然要说指针,那当然不能不先展示一下,什么是指针:


int *p;
复制代码

相信看这篇文章的人,多少也都知道该怎么声明一个 C 语言的变量,上面的代码声明了一个最简单的指针,其实指针就是一个特殊的变量。只要声明的时候在变量名前面加上一个星号*就可以了,编译器会为我们搞定剩下的事。

没什么难度,right?但若要想将它应用自如,我们还需要看一看指针的跟脚究竟是何方神圣。

指针的本质

这个论题其实大的很,指针究竟是什么?市面上的书对此各有各的见解,有的称其为“一个路标”、也有的称其为“一个地址”,更有甚者称其为“一个指向某地址的指针”(你搁这搁这呢)。

回到原点,我们可以看到,如此之多的解释其实都在隐隐约约的透露着同一个内容,那就是:


指针变量是指向某个地址的变量。

——Xeler

上面这个人也搁这搁这呢。

——夏尔


先别急!要搞懂搁这搁这的指向指向指针函数的指针数组的指针究竟是哪来的秦川德里奇,我们需要先弄明白很多东西,比如第一步,先搞清楚内存是个什么牛马?

内存

地球人都知道,计算机是用电的(废话)。但你有没有想过,内存究竟是怎么用电的呢?

答案是锁存器,我们今天不需要关心那么多技术细节,你只需要知道内存里面有超级多(4G 的内存差不多就有 410241024*1024*8=34,359,738,368,约 340 亿个)锁存器,这些东西在通电运转的时候只会有两种状态:高电平或者低电平,我们称之为 1 和 0。内存这个配件像是一个仓管一样,管理着所有这些的锁存器,并给他们挨个编好号。

那这些编号长成什么样子呢?实际上,这些每 8 个一组的锁存器编号接近于这样:

心 肺 停 止

咳,实际上应该是长成这样↓


0x1234 5678也就是0x12345678
复制代码

0x 打头的数字意思是 16 进制,不属于本篇该讲的范畴,实际上这个东西就是我们常说的地址。

小贴士:我们常说的 1GB 实际上是 1024MB=1024*1024KB,每 KB 又是 1024Byte,1Byte=8Bit,我们常说的 32 位和 64 位 CPU,实际上代表的就是 CPU 究竟运算的是 4Byte 数据还是 8Byte 数据(计算机采用 1024 进制,而不是通常情况下硬盘/U 盘厂商计算容量时采用的 1000 进制,可以看看你的硬盘是不是这样(1T 只有 931G 左右))


操作系统的骗局

讲到这里,某些悟性比较高的孩子可能就回去动手尝试了,但不知道你们有没有发现一个状况:某些时刻,两个程序会使用同一个地址的内存空间?

发生这种状况是因为操作系统设下了一个骗局:虚拟内存,关于它的原理我们暂且按下不表,我们只需要知道,在应用程序看来的内存是单独属于它的 16G,而这个大小是由操作系统管理的,也正是基于这个虚拟内存区,我们才有可能在一些硬件性能并不富裕的电脑上高速应用程序。而我们的指针获取的内存地址,实际上也是这个虚拟内存的地址(我们称之为逻辑地址),而非真实意义上内存的地址(我们称之为物理地址)。

所以,好孩子千万不要试图通过指针越界去访问别的应用程序哦。


那么指针究竟是什么

经过上面的一系列讲解,你应该能清楚地址究竟是个什么东西了:就是内存里面存数据的单元的一个编号而已,藉由此,我们可以得出一个结论:其实指针就是一个十六进制的整数变量嘛。

完全没错,毕竟指针的严格全称是指针变量,变量变量,也就是个存 0 和 1 用的东西。(严格来说,C 语言里面只有整数变量和浮点数变量,字符和指针的实质都是整数变量)

完全正确,但远远不够。明白指针是个什么鬼只是第一步,要完全理解指针里的弯弯绕绕,我们还有一点点路要走。(比了个指尖星河)但别急,请允许我留到下期再讲,不如点个三连支持一下?


用户头像

Integer

关注

生年不满百,何怀千岁忧 2021.03.30 加入

C/C++工程师,专门研究犄角旮旯里的DeadTechnology

评论

发布
暂无评论
浅论指针(一)