要明白什麼是指標,必須先要弄清楚資料在記憶體中是如何儲存的,又是如何被讀取的。
如果在程式中定義了一個變數,在對程式進行編譯時,系統就會為這個變數分配記憶體單元。編譯系統根據程式中定義的變數型別分配一定長度的空間。記憶體的基本單元是位元組,一位元組有8位元。每位元組都有一個編號,這個編號就是“地址”,它相當於旅館的房間號。在地址所標示的記憶體單元中存放的資料,就相當於在該旅館房間中居住的旅客。
大家一定要弄清楚“
記憶體單元的地址”和“
記憶體單元的內容”這兩個概念的區別,即“房間號”和“房間內所住客人”的區別。在程式中一般是通過變數名來對記憶體單元進行存取操作的。其實程式經過編譯以後已經將變數名轉換為變數的地址,對變數值的存取都是通過地址進行的。這種按變數地址存取變數的方式稱為直接存取方式。
還有一種間接存取的方式,即變數中存放的是另一個變數的地址。也就是說,變數中存放的不是資料,而是資料的地址。就跟尋寶一樣,可能你按藏寶圖千辛萬苦找到的寶藏不是金銀珠寶,而是另一張藏寶圖。按C語言的規定,可以在程式中定義整型變數、實型變數、字元型變數,也可以定義這樣一種特殊的變數,它是存放地址的。
由於通過地址能找到所需的變數單元,所以可以說,地址“指向”該變數單元。如同一個房間號指向某一個房間一樣,只要告訴房間號就能找到房間的位置。因此在C語言中,將地址形象地稱為“指標”,意思就是通過它能找到以它為地址的記憶體單元。
所以,
一個變數的地址就稱為該變數的指標。指標就是地址,而地址就是記憶體單元的編號。它是一個從零開始的、操作受限的非負整數。
為什麼是操作受限的?因為非負整數與非負整數可以加減乘除,但是指標和指標只能進行相減運算,不能進行其他運算,因為沒有意義。而且進行相減運算也是有條件的:只有同一塊空間中的地址才能相減。而且兩個指標變數相減之後的結果是一個常數,而不是指標型變數,即相減的結果是這兩個地址之間元素的個數,而不是地址的個數。這個後面還會再講。
記憶體中一個單元指的是一位元組,一位元組有 8 位。每根地址匯流排都有兩種狀態:0 和 1。兩根地址匯流排就有 4 種組合,能控制4個記憶體單元;三根地址匯流排就有 8 種組合,能控制 8 個記憶體單元;n 根地址匯流排就有 2
n 種組合,能控制 2
n 個記憶體單元。那麼 CPU 總共是通過幾根地址匯流排對記憶體進行處理的?一般的計算機是 32 位的,即 32 根地址匯流排,那麼就能夠控制 2
32 個記憶體單元,即 2
32 位元組。
2
32B=4GB,所以 32 位系統的計算機只能控制 4GB 的記憶體。前面討論為什麼記憶體不做得同硬碟一樣大,原因就在這裡。