C語言中的指針

指針是C語言中非常重要的東西,書本上寫了好多來解釋裏面的原理,當年老師也跟我們講了好多這方面的東西,一直就是感覺沒有聽明白。直到我看到了指向指針的指針,我建立了自己的理解,不知道是否正確,但是基本能解決遇到的問題。


int *p , p=&i , *p。

type *p,聲明指針變量,type(例如int)告訴計算機p這個指針指向的這個東西佔用多少個字節(byte)。

例如int *p,i ; p=&i ; 這一句告訴計算機有一個指針p , 它指向 i 所佔的4個地址的第一位,由於提前告訴計算機,我這個是int型指針,計算機就知道p指向的變量到底有多長,所以當執行*p+1時,這個時候計算機就知道要跳過4個地址。


p到底是什麼?他就是一個快捷方式。快捷方式存的就是你程序所在的地址。

那麼p有多大?你有多少個地址,p就有多大,這是根據操作系統來區分的。

例如在32位系統中,尋址空間爲2^32,那麼對於的p就要能區分2^32個地址,就是32位的2進制數,換算成字節就是4個字節,顯然得知,64位系統,就是8個字節。

如果不是這麼大,那麼就不能保證所有的地址都有唯一編碼了,就無法表示了。

所以p裏面存的內容就是 i 所在的地址的第一位,也就是A(這裏用ABCDEFGH來代表一個存儲地址,根據計算機位數不同,他可能代表一個32位的2進制數,也可能代碼64位的2進制數。)

*p是指,我要去讀取p指向的地址裏面存的內容。計算機會先去找到A,然後因爲p是int型,它佔4個字節,那麼計算機就順着讀4位,讀了(ABCD)中共同表示的內容,也就是 i 的值。


好!這裏理解了,現在聊一下指向指針的指針,就非常好理解了。


q=&p

q裏面存的是p指針所在的地址,因爲int *p是會給指針p分配一個地址,這個地址裏面,存着地址A。

*q就是查看&p這個地址裏面存的到底是什麼內容。這裏的話就會發現,它存的是地址A。

那麼**q就等同於*p,而*p又表示 i 的內容。


所以就非常好理解了。


我們可以這麼認爲:

我們計算機裏面的所有地址與裏面的內容一一對應,指針就是分配一個地址,讓裏面的內容是一個地址信息。

而其他類型的變量,就是在一個地址裏面,存着由二進制碼錶示的內容。



再聊一下*這個運算,*(地址),是去讀地址裏面存的東西。假設m=&q,我們可以用***m去訪問i的值。如果*後面接的不是地址,這個量也會被認爲是地址,執行*運算後,就會不知道指向哪裏,就有亂碼之類的情況出現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章