本系列分三篇,用破玩意的方式彻底理解好指针的本质:
- 你管这破玩意叫指针 -- 基础篇
- 你管这破玩意叫指针 -- 进阶篇
- 你管这破玩意叫指针 -- 变态篇
话不多说,开始!
内存,通常被严谨地画成下面这个样子,一个下方是低地址上方是高地址的格子楼 。
文章插图
但我今天换种画法,画成下面这个样子 。
文章插图
每个格子代表内存中的 1 个字节(8 位),格子上的数字就代表内存地址,我也直接用 10 进制来表示了,免得 16 进制又算不明白了 。
目前内存是完全空的,格子里没有任何内容 。
试想一下,如果你忘掉所有的语法规则和编程规范,你会如何描述对这些内存格子的操作呢?
一、类型系统
很简单,往格子 3 处放个数字 29,往格子 6 处放个数字 38,就这么简单直接地描述即可 。
文章插图
但是这样说话太麻烦了,什么往格子 3 处放个数字 29 的,废话太多,也不方便不讲感情的计算机去理解 。
那我们就定个指令,使用 mov $x, (y) 表示把数字 x 放入格子 y,如下:
mov $29, (3)
mov $38, (6)
这就表示刚刚说的:
把数字 29 放入内存格子 3
把数字 38 放入内存格子 6
是不是太简单了?别急,好戏马上开始!
如果要把数字 999 放入内存格子 8,该怎么办呢?
由于 1 个格子表示 1 个字节,只有 8 位,因此只能表示 256 个数字,要么是有符号的 -128 ~ 127,要么是无符号的 0 ~255,显然数字 999 无法放在 1 个格子内,只能占用 2 个格子了 。
那也好办,就这么说,把数字 999 放入格子 8,连续占用两个格子 。
文章插图
但这样,我们刚刚的 mov 指令就得改改了,不但要表示"存放"这个含义,还得表示占用了多少个格子 。
我们用 movb 表示只占 1 个字节,用 movw 表示占用 2 个字节 。那么,刚刚的三个数字,就分别可以这样用指令来表示了:
movb $29, (3)
movb $38, (6)
movw $999, (8)
含义就是:
把数字 29 放入内存格子 3,占 1 个字节
把数字 38 放入内存格子 6,占 1 个字节
把数字 999 放入内存格子 8,占 2 个字节
OK,既然有了 1 字节和 2 字节的的指令,不妨再设计下,用 movl 表示 4 字节,movq 表示 8 字节 ...
movb 占用 1 字节
movw 占用 2 字节
movl 占用 4 字节
movq 占用 8 字节
不知不觉,类型系统就被你悄悄设计出来了!当然,虽然这只是个半成品 。
二、变量
你不断地往不同格子里放数据 。
比如我把我的年龄放在 11 号格子(占 1 字节),把我的月薪放在 14 号格子(占 4 字节) 。
文章插图
现在我们的内存已经非常混乱了,你根本记不住原来的 3 号格子放的数据表示什么,11 号格子又表示什么,只能通过看数字知道 14 号格子里放的确实是我的月薪 。这该怎么办呢?
增加一层抽象嘛!我们给这些放了我们数据的格子,都贴上个标签,就可以不用再记那些无意义的格子编号了 。
文章插图
这样以来,其实我们也不再关心,这些标签到底在哪个格子里,只要给我找到格子把我的数据放进去就可以了 。
movb $29, a
推荐阅读
- 南戴河之旅 南戴河吧
- dnf守护者之魂怎么样 dnf守护者之魂
- 轰趴馆是什么玩意;什么是轰趴馆?
- 酸汤子是啥玩意 酸汤子是啥
- 汪小菲|徐妈留言让汪小菲别说了,汪小菲:让你家小玩意儿闭嘴!
- 王鹤棣|王鹤棣假装为沈月提裙子:郭德纲这都教的什么玩意?
- 周迅|周迅拍大片又被嘲?!网友无奈:人是美的,拍的什么玩意儿…
- 梧桐妹|梧桐妹穿辣妹装,继父修杰楷善意提醒不好看,却遭回怼“要你管”