指針對一部分初學者來說一直是乙個無法逾越的障礙,沒有指標的c語言就好像沒有左腿的短跑運動員。今天我來試試換一種方法來理解指標,希望能幫還在為指標掙扎的朋友們理清思路,高手略過即可。
我們先認為記憶體是一家客棧(看起來這和老掉牙的大樓的比喻沒什麼區別,但是請你耐心看下去)。
同大部分的客棧一樣,這家客棧有天、地、人等各種檔次的房間,用現在的話就是單人間、雙人間、四人間等等。來住店的客人也是車水馬龍,三教九流都有,我們看看都有哪些人:
快樂單身漢char,還有char的小弟unsigned char,他們只住單人間;
short int, unsigned short int都是已婚無孩,他們只住二人間;
int, unsigned int, long int, unsigned long int,這些都是四口之家,當然住四人間了;說起來這裡面的前兩位,int和 unsigned char,在dos時代還是二人世界,住二人間,後來出了32位系統後,他們才成為四口之家,等到了64位時代,他們中有人會變成8口之家。人口變化太快,所以人口問題就不討論了,只要知道有幾口人(幾個位元組)就住幾人間就行了。
另外還有一些更龐大的家庭double,float我們就不一一贅述了。
住客棧是要登記的,至少老闆要知道哪個房間沒人住,好租給新來的客人吧?於是就把每位客人的房間號都記在了紙上,然後把紙捲在了針上,大大節省了空間,這就是紙針(指標*)啦,^_^。為了安全,登記完的指標也放在客房裡了,不過是沒有人住的房間。
雖然指標分為很多顏色(型別),但是不管多大的家族都只住一間屋子,只有乙個房間號,所以無論什麼顏色的指標都具有相同的大小,長度就是房間號那麼長。
並非所有人都像int a[100]那麼幸運,他們來的時候正好一層100個房間都沒人住,於是他們可以住在同一片連續的區域。上次m, n, p, q, r一起來想住連續的幾個屋子,方便一起去玩,偏偏找不到合適的房間,只好m住3樓,n住5樓,…,總之都很遠。可是m老是來問老闆他的朋友們住**?老闆每次要找半天,後來想了個辦法,把記錄這幾個人的指標用乙個盒子*p[5](指標陣列)放在一起,這樣就方便多了。
有的客人脾氣很怪,比如char f[4],他們四個是乙個樂隊的,可是又不願住四人間,非要一人住一間,還一定是連著的,如果不連著就不住,老闆沒辦法,給他們找了連著的四間房。可是大牌還真是難纏,他們早上出去工作就退房,晚上又要回來住,老闆又要給他們找連續的四間房,天天如此,而且每次都浪費四個指標,客棧的成本一下提高了。老闆又想了個辦法,他專門為這些人訂做了另一種顏色的指標(*p)[4](指向陣列的指標),他用這個指標記錄他們老大f[0]的房間號,剩下的三位房間號就是緊挨著的三間,減少了不少浪費。
一直忘了介紹客棧的兩個夥計,乙個叫「小&」,另乙個叫」小*」,看外形就知道,」小*」比較圓滑,肯定是經常可客人,而「小&」肚子比較大,一看就是常年打算盤,記帳不活動造成的。有時候有人來客棧找住店的人,首先要查詢客人的房間,「小&」就是負責去取儲存房間號的指標的,比如上面提到的m想找r去逛街,「小&」就去找r的指標了(&r), 「小&」找了半天,終於找到了r的指標p(p = &r),他把p交給」小*」, 」小*」就拿著p去叫客人了(*p就是r了)。看起來好像」小*」的工作比「小&」輕鬆,其實」小*」也不容易,他要區分指標的顏色(型別)來決定叫多少個人,比如拿的是藍色的指標(上面說得是char型),就只叫乙個客人就可以,如果是紅色的(int)就得叫4位客人,如果少叫了一位樓下找人得客人會生氣得,因為沒有把要找的人找全。
好了,這家客棧介紹完了,為了感謝你看到這裡,現在客棧經營權就交給你了,希望你財源廣進!
對指標的理解
在c語言中可以認為一切皆位址。int a 10 1 根據函式型別申請一塊記憶體,並將記憶體的名字命名為a 2 將10以二進位制補碼形式寫入記憶體 賦值 我們將這種通過變數名引用變數,由系統自動完成變數名和其儲存位址之間的轉換的方式,稱為變數的 直接引用 記憶體是線性,因為不同型別的變數占用不同大小的...
個人對指標的指標理解
每次一看到兩個 號,就頭疼,終於在一次看源 時,看了半天才弄明白其中含義,所以寫一寫對指標的指標的理解。int main 以乙個小例子來說明 我們將a指標稱為一級指標 因為a指標變數儲存的位址儲存的是乙個具體的數值或者字元,反正不再是位址值 b稱為二級指標,因為b是指向指標的指標,以此類推long ...
對指標的基礎理解
p和num的關係如上圖所示,p對應的記憶體空間裡儲存的是num對應記憶體空間的位址。如果進行p 操作,得到的是0x1004,因為int型變數是四個位元組,如果是num是char型,那p 的結果就是0x1001。這也是步長的概念,對指標加一,跳了多少位元組,步長就是多少。如果進行 p 操作,得到的就是...