再談雙指標
之前我寫過一篇部落格《深入理解雙指標》,最近也再次重溫《c++ primer》讀到指標那一章節的時候,度c/c++指標又有了新的領悟。
《c++ primer》中強調了乙個指標解引用的概念。
究竟什麼是解引用呢?
為了解釋解引用這個概念,我引用《c++ primer》中的一段話:
when we dereference a pointer, we obtain the object to which the pointer points
從上面這段話可以看出解引用的物件是指標,當我們對指標解引用的時候,我們得到的是指標所指向的物件。按照c語言的習慣,當我們隊指標解引用的時候,我們得到的是該指標所指向的結構。
舉個例子:
c/c++中,變數或者結構都有乙個作用域。
要想在作用域b中修改作用域a中的非指標變數的值(比如 int 資料),就必須將該變數的指標傳入到作用域b中,
然後對指標解引用,然後作出任何修改都會反饋到該指標所指向的資料,否則值傳遞無法反饋修改結果,即修改是無效的。
上面version1**,作用於funca中的變數直接值傳遞到作用域swap中,由於param1,param2的作用域僅限於swap。
所以,對param1, param2的任何修改都不會反饋到funca中,所以,a和b不會有任何變化。
所以,為了使非指標變數的值能夠在不同的作用域中進行修改並反饋結果到不同域中,那就是用一級指標(為了區別後面要重點講述的雙指標)吧,然後對指標解引用,之後修改的任何結果都會被反饋到不同的域中。
上面version 2中,就是用了一級指標,對指標解引用之後,對其作出的任何修改都會反饋到指標所指向的資料。
所以,a和b的資料發生了變化。
上面version 3的**,我們想要修改buffer本身這個指標的值,但是getmemory(buffer)之後,buffer的值還是null,並不是所希望的那個molloc之後堆中那個起始位址。
分析如下:
ptr的作用於在getmemory中,雖然我們傳入了buffer這個指標,但是由於ptr是區域性變數,對ptr做修改無法反饋到getbuffer域中
所以,為了使指標變數的值(不是指標變數所指向的值)能夠在不同作用域中進行修改並反饋修改結果,使用雙指標吧,然後傳入需要修改的指標的位址,然後對解引用作出的任何修改都將反饋到該指標。
雙指標定義和申明:
int **p從這個申明中就可以知道,指標的指標,p所指向的值也是乙個指標,即p指向的值也是乙個位址。
然後對p解引用: *p
之後,對*p的任何操作都將反饋到p所指向的位址的值,從而達到對指標本省的修改
對指向非指標變數的指標[指標的內容是非指標變數的位址](其實就是該變數的位址)進行解引用,作出的修改可以反饋到該指標所指向的值,這裡的值是非指標變數。
對指向指標變數的指標[指標的內容指標變數的位址]進行解引用,作出的任何修改可以反饋到該指標所指向的值,這裡這個值是指標變數本身的值(不是指向的值)。
綜合1和2可以得出乙個結論:對解引用之後的任何操作,都將反饋給該指標所指向的值。而這個值可以分為指標變數和非指標變數。
回答:當我們需要修改指標變數本身的值的時候,可以使用雙指標
很多情況下,雙指標都可以通過其他途徑,比如使用return來反饋結果。
更多理論,請參看我的另一篇部落格《深入理解雙指標》
再談怎麼理解雙指標
原文出處 之前我寫過一篇部落格 深入理解雙指標 最近也再次重溫 c primer 讀到指標那一章節的時候,度c c 指標又有了新的領悟。c primer 中強調了乙個指標解引用的概念。究竟什麼是解引用呢?為了解釋解引用這個概念,我引用 c primer 中的一段話 when we dereferen...
寒假刷雙指標《雙指標》
633.平方數之和 難度中等163 給定乙個非負整數c,你要判斷是否存在兩個整數a和b,使得a2 b2 c。示例 1 輸入 c 5輸出 true解釋 1 1 2 2 5示例 2 輸入 c 3輸出 false示例 3 輸入 c 4輸出 true示例 4 輸入 c 2輸出 true示例 5 輸入 c 1...
快慢指標 雙指標
雙指標 二 左右指標的常用演算法 鏈結 利用快慢指標 最開始slow與fast指標都指向鍊錶第乙個節點,前者解決主要解決鍊錶中的問題,listnode detectcycle listnode head slow head while slow fast return slow 設相遇點距環的起點的...