每次一看到兩個*號,就頭疼,終於在一次看源**時,看了半天才弄明白其中含義,所以寫一寫對指標的指標的理解。
int main()
以乙個小例子來說明:
我們將a指標稱為一級指標(因為a指標變數儲存的位址儲存的是乙個具體的數值或者字元,反正不再是位址值)
b稱為二級指標,因為b是指向指標的指標,以此類推long ***就是**指標
我認為在考慮多級指標的時候,一定要抓住不變的量,也就是這個指標變數自身儲存的是什麼,如果儲存的是位址,那麼該位址指向哪一塊。比如程式中a指標自身儲存的是變數t的位址,該位址指向的值(或者說該位址儲存的值)是100000006。而b指標自身儲存的是a指標的位址,該位址指向的值是t變數的位址。
當這些不變的量明確以後,我們再來看cout<<*(short **)b;這句程式。首先忽略強轉型別,可以發現是*b,所以cout的值一定和t變數的位址有關,因為已經知道b儲存的是位址,指向的是位址,對b取星號,一定得到的是位址值(除非強轉成一級指標)。然後再看強轉型別,其實這裡強轉型別有很多可以達到同一目的,就是獲取t的位址,比如int**,int***,int****,char***,long**,long***等等。這是由於所有二級以上的指標加*號,比如*(int**),*(int***)等都是從指向位址開始往後取四個位元組,因為位址統一都是四個位元組,所以指向指標的指標取位址都是這樣。這裡也就對比了比如char*變數只會取1個位元組,unsigned int*取四個位元組,long*取8個位元組等等。有乙個小技巧就是你想指定取從位址開始的幾位,就可以先強轉指標比如我想取四個位元組, 可以*(insigned int*)(ptr)這樣就可以取出ptr指標指向位址的後四個位元組。所以無論指標再怎麼強轉,它本身的值以及指向的值是不會變的,變得只是使用該指標時,需要往後取幾個位元組
但是這裡cout<<*(char **)b;是不可以的,這是由於cout的原因,因為cout會把char*指向的字串的值全部輸出出來,並且也不是只取乙個位元組,會取到出現/0停止符為止。
對指標的理解
指針對一部分初學者來說一直是乙個無法逾越的障礙,沒有指標的c語言就好像沒有左腿的短跑運動員。今天我來試試換一種方法來理解指標,希望能幫還在為指標掙扎的朋友們理清思路,高手略過即可。我們先認為記憶體是一家客棧 看起來這和老掉牙的大樓的比喻沒什麼區別,但是請你耐心看下去 同大部分的客棧一樣,這家客棧有天...
對指標的理解
在c語言中可以認為一切皆位址。int a 10 1 根據函式型別申請一塊記憶體,並將記憶體的名字命名為a 2 將10以二進位制補碼形式寫入記憶體 賦值 我們將這種通過變數名引用變數,由系統自動完成變數名和其儲存位址之間的轉換的方式,稱為變數的 直接引用 記憶體是線性,因為不同型別的變數占用不同大小的...
從指標到指向指標的指標 個人理解!
c c 是工科學生必不可少的課程。本人是電子通訊行業的,客觀上說沒有計算機 軟工專業的學生更加專業!但是我們也得會程式設計,不然的話畢業以後沒有飯碗啊!下面寫一下個人對指標的理解。首先,我們要知道定義乙個變數就會在記憶體中開闢乙個空間,這個空間就是儲存這個數的。例如 int value 2131 計...