前一篇跟大家聊了聊指標的概念,可是就算了解了指標是什麼,為什麼依然感覺難學?我試著從幾個點切入,聊聊指標難學之處。
難點1. 討厭的星號
定義指標變數p時,都會加個號。在用到指標變數p時,也會加個號。比如以下**:
int main()
程式定義了乙個指標變數p,前面有個號;後面給指標p指向的記憶體區域賦值1,又有個號,這兩個*號有啥區別呢?很多初學者在這裡會搞不懂。
定義指標p時,前面的號只是告訴編譯器,p是個指標,其它沒什麼用處。我個人一直認為,當初發明c語言時,定義指標p時不應該用來說明,你可以用@號,用#號,用$號,隨便用什麼號來說明p是個指標,這樣就不會與下面用到指標p時的*混淆了。
所以*號出現在不同的位置,有不同的作用,這是剛開始學指標時難學的乙個地方。
難點2. 分不清址與值
這裡的址就是位址,就是很多教材喜歡說的指標變數是個位址,位址,位址。。。。地你妹啊,誰看得懂什麼位址位址位址的!而值,就是指標p指向的資料。
還借用上面的**,跟指標p相關的資料就兩個,乙個是指標p自己的值,程式中是明顯看不到的,是程式執行時作業系統才能看到的,指標p自己的值就是教材中提到很多次的「位址」;另乙個就是指標p指向的值,程式中就是常量「1」。
我認為很多教材只會講位址,位址,位址,根本就沒有講清這個「址」與「值」這兩者的區別,誰搞得懂。
難點3. 借助址來讀值
指標有自己的值的概念,有指向的值的概念,兩者的關係也是讓初學者迷糊的。指標要借助自己的值,去找到指向的值,也就是借助址來讀取值。
就像上面的**片段,假設指標p自己的值是0x12345678,這就是乙個記憶體區域的位址,借助這個址,再結合星號,就可以將整數1放在0x12345678這塊記憶體中了。此時,指標p借助自己的值(0x12345678)指向了乙個值(1)。
呵呵,借址讀(寫)值,已經讓人暈了。
難點4. 鍊錶結點
如果上述3點還不算**的話,那麼結合鍊錶這種資料結構,那就相當的**了。
比如鍊錶的結點往往定義為乙個結構體,就像這樣:
struct node
然後會有什麼建立鍊錶啊,插入鍊錶啊,刪除鍊錶啊,哪乙個操作不會用到指標next?
本來鍊錶操作就讓人煩了,再加上指標這個東東,真是煩上加煩。
可不是嘛,比如定義了乙個結點變數指標p,如下
struct node *p;
然後你就會看到滿程式都有p->next,說不定還有其它的結點變數指標q,再來個p->next = q->next,或者q->next = p->next,讓人眼花繚亂,能不煩不。
本文先提這4點指標難點,也許還有其它的難點,本文也不贅述了。不管怎樣,指標雖難,但是只要理解其本質,那麼理解指標,或者理解一段包含指標的**,或者寫一段含有指標的**,只是時間問題。
C專題指標4
一.函式的指標 1.乙個函式在編譯時被分配乙個入口位址,這個函式的入口位址就稱為函式的指標。每乙個函式都占有一段記憶體單元,它們有乙個起始位址。函式名代表該函式的入口位址。2.指向函式的指標變數的一般定義形式為 資料型別 指標變數名 函式形參列表 3.在乙個程式中,乙個函式指標可以先後指向同型別的不...
C語言指標專題 如何理解指標
小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 最近在研讀c primer plus 5版中文版,老外寫的,還是很經典的,推薦給讀者們,有需要的朋友可以在這裡購買 c primer plus 5版中文版 指標,傳說中是c語言中的乙個難點,且是難點中的難...
C語言指標專題 序
小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 看到好多的c語言初學者學到指標時,都覺得指標怎麼那麼難啊!我也想起了我當時學習指標時遇到的困難,確實很難!到底是教程寫的不好呢,還是老師教的不好呢?我覺得都有。網上搜尋指標講解的資料很多,我也看了不少,不...