一.指針到底是什么
指針(pointer)到底是什么,弄清楚這個問題很重要,這是我們所討論的話題的源頭,而在闡述指針是什么之前,我們需要先來看一下變量的概念。
我們知道,計算機的內(nèi)存(PRimary storage)被劃分為多個存儲單元,這些存儲單元可以以單個或者順序相連組成一個更大單元的方式被使用。每一個單獨的存儲單元都是一個字節(jié)(byte),它通常由8個位(bit)組成,每一個位可以表示的值只有0或1。每一個存儲單元都被一個及其分配的標識唯一地表示,而這個標識就是地址。
下圖表示了存儲單元單獨被操作時的情形,矩形表示存儲單元,矩形內(nèi)的內(nèi)容是存儲在這個內(nèi)存單元的具體的值。矩形上方的數(shù)就是每個內(nèi)存單元的地址。因為每個單元為一個字節(jié),而每個字符型常量(character constant)所占據(jù)的正是一個字節(jié),如下所示:
                              
再來看下面的圖:
                         
這次的情況是順序連成組進行操作,對于整型常量(integer constant),在32位計算機中需要四個字節(jié)來存儲(有一點要聲明,208位置的那個矩形里的1078345超出了int類型的范圍,是long int類型,但ANSI C只規(guī)定了long型數(shù)據(jù)長度不小于int型,int型數(shù)據(jù)長度不小于short型,并規(guī)定int型為16位,long型為32位,然而很多編譯器采取的策略是使long和int型數(shù)據(jù)占據(jù)相同的內(nèi)存字節(jié)數(shù),即全為32位),所以地址以4個單位增長(也就是說現(xiàn)在的一個矩形表示4個內(nèi)存單元),這次矩形下面多了幾個小寫字母,存儲在矩形里面的值不是固定唯一的,而是可變的。我們可以把矩形認為是一個變量(variable),每次我們要引用矩形里的值時,機器都是通過地址來定位(那個矩形)并取得其中的值的,而對于我們來說要記住這些地址幾乎是不可能的,所以高級語言提供了用名字來訪問內(nèi)存位置的特性,它們就是變量名,即上圖的a,b,c,d。
現(xiàn)在用變量名替換掉上圖中的地址:
                         
大家要注意,變量名與地址的關(guān)聯(lián)是由編譯器為我們實現(xiàn)的,具體的實現(xiàn)方式我們無需關(guān)心,但要清楚硬件仍然是通過地址訪問內(nèi)存位置的。接下來,繼續(xù)看圖:
                    
來看新增的Ptr,同樣是個變量,它也有地址,它的值是變量a的地址。至此可以給出指針的定義了:指針是一種用于存放另一個變量的地址的變量。上圖中的Ptr就是一個指針,并且我們說它指向了變量a(因為Ptr的值是變量a的地址),要注意指針中只能存放地址,不能將一個整型量或者其他非地址類型(整型數(shù)0及具有0值的整形常量表達式除外,后面的文章會細致講解)的數(shù)據(jù)賦給一個指針!
還有,指針這個詞,由于是對pointer這個詞翻譯得來,完整的叫法應(yīng)該是指針變量,由于指針變量中存的地址,而在很多英文資料中,指針(pointer)的涵義不完全都是指針變量,有時也指地址,請大家在閱讀或參考資料時注意區(qū)分!
(注:本章及后續(xù)章節(jié)中用以表示內(nèi)存的矩形中的值及其地址只是為了簡潔易讀從而采用十進制數(shù)表示。)
前言
2.指針的定義及運算
3.指針與數(shù)組的“愛恨情仇”
4.分清函數(shù)指針和指針函數(shù)
5.指針與結(jié)構(gòu)
6.使用指針時的“陷阱”
后記
新聞熱點
疑難解答