## 指针是什么?
内存是以字节为单位的一个很大但是又经常不够用的空间。指针是内存中 x 个连续的字节中存储的数据——在 32 位的机器上,x 的值为 4;在 64 位机器上,x 值为 8。为了叙述的简便,本文只在 64 位的机器上谈论指针。
指针是一种数据,这没什么稀奇的。从机器的角度来看,程序的一切是存放在数组中的数据。只有那些自作多情的程序猿才会像亚里士多德一样自作多情的认为程序是由对象 + 方法或者许多函数复合而成的。事实上,从最远离机器的 Lisp 语言的角度来看,程序的一切也都是数据,存放在表中的数据。如果忽视程序本身就是数据这个客观事实,程序猿们很容易就走上了形而上学的道路,然后他们会度过漫长的、罪恶的、痛苦的中世纪,膜拜着一个又一个神棍,当然期间也出现了几位圣·奥古斯丁。
那么,指针中存储着什么数据?内存地址。
内存是以字节为单位的空间,其中每个字节都伴随着一个地址,这个地址机器赋予的,并不是我们的程序编制的。你可以将整个内存空间想象成一栋大楼,将字节想象为大楼中每个房间,将每个字节的地址想象为房间的门牌号,于是指针中存储的数据就类似于门牌号。
如果你从未学过 C 语言,读到此处可能会问,我们为什么要在内存中存储内存地址?不知你是否住过宾馆。在正规的宾馆里,每个房间的门后都会贴着逃生路线图,图中『存储』了该宾馆与你的房间同一楼层内的全部房间的门牌号以及它们的布局。如果你住酒店时从来也不看逃生路线图,那么从现在开始,入住酒店后第一件事就是认真的看一下它,关键时刻它能救你一命。在内存中存储内存地址,虽然不是救你性命的,但是可以藉此构造与宾馆逃生路线图相似的抽象事物——内存数据的抽象与复合。
![](https://box.kancloud.cn/2015-12-28_5680d097bb2ad.jpg)