指標是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指標所在的位址,因為int *p是會給指標p分配乙個位址,這個位址裡面,存著位址a。
*q就是檢視&p這個位址裡面存的到底是什麼內容。這裡的話就會發現,它存的是位址a。
那麼**q就等同於*p,而*p又表示 i 的內容。
所以就非常好理解了。
我們可以這麼認為:
我們計算機裡面的所有位址與裡面的內容一一對應,指標就是分配乙個位址,讓裡面的內容是乙個位址資訊。
而其他型別的變數,就是在乙個位址裡面,存著由二進位製碼表示的內容。
再聊一下*這個運算,*(位址),是去讀位址裡面存的東西。假設m=&q,我們可以用***m去訪問i的值。如果*後面接的不是位址,這個量也會被認為是位址,執行*運算後,就會不知道指向**,就有亂碼之類的情況出現。
C 語言中的指標
指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編...
C語言中的指標
隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...
C語言中的 指標
讓你不再害怕指標 要了解指標,或多或少會有一些複雜的型別,讓人思緒萬千。其實要理解複雜型別其實很簡單,乙個型別裡會出現很多運算子,但他們和普通的表示式一樣,也有優先順序。所以 從變數名處起,與運算子優先順序結合,一步一步分析。先從簡單的型別開始分析 int p 這是乙個普通的整型變數 int p 從...