## 指針是什么?
內存是以字節為單位的一個很大但是又經常不夠用的空間。指針是內存中 x 個連續的字節中存儲的數據——在 32 位的機器上,x 的值為 4;在 64 位機器上,x 值為 8。為了敘述的簡便,本文只在 64 位的機器上談論指針。
指針是一種數據,這沒什么稀奇的。從機器的角度來看,程序的一切是存放在數組中的數據。只有那些自作多情的程序猿才會像亞里士多德一樣自作多情的認為程序是由對象 + 方法或者許多函數復合而成的。事實上,從最遠離機器的 Lisp 語言的角度來看,程序的一切也都是數據,存放在表中的數據。如果忽視程序本身就是數據這個客觀事實,程序猿們很容易就走上了形而上學的道路,然后他們會度過漫長的、罪惡的、痛苦的中世紀,膜拜著一個又一個神棍,當然期間也出現了幾位圣·奧古斯丁。
那么,指針中存儲著什么數據?內存地址。
內存是以字節為單位的空間,其中每個字節都伴隨著一個地址,這個地址機器賦予的,并不是我們的程序編制的。你可以將整個內存空間想象成一棟大樓,將字節想象為大樓中每個房間,將每個字節的地址想象為房間的門牌號,于是指針中存儲的數據就類似于門牌號。
如果你從未學過 C 語言,讀到此處可能會問,我們為什么要在內存中存儲內存地址?不知你是否住過賓館。在正規的賓館里,每個房間的門后都會貼著逃生路線圖,圖中『存儲』了該賓館與你的房間同一樓層內的全部房間的門牌號以及它們的布局。如果你住酒店時從來也不看逃生路線圖,那么從現在開始,入住酒店后第一件事就是認真的看一下它,關鍵時刻它能救你一命。在內存中存儲內存地址,雖然不是救你性命的,但是可以藉此構造與賓館逃生路線圖相似的抽象事物——內存數據的抽象與復合。
