原文出處
之前我寫過一篇部落格《深入理解雙指標》,最近也再次重溫《c++ primer》讀到指標那一章節的時候,度c/c++指標又有了新的領悟。
《c++ primer》中強調了乙個指標解引用的概念。
究竟什麼是解引用呢?
為了解釋解引用這個概念,我引用《c++ primer》中的一段話:
when we dereference a pointer, we obtain the object to which the pointer points
從上面這段話可以看出解引用的物件是指標,當我們對指標解引用的時候,我們得到的是指標所指向的物件。按照c語言的習慣,當我們隊指標解引用的時候,我們得到的是該指標所指向的結構。
舉個例子:
view plaincopy to clipboardprint?
int idata = 24;
int *ptr = &idata;//定義乙個指標指向idata
/**這裡就是對指標ptr解引用
解引用之後得到ptr所指向的結構,也就是idata,賦值給getdata
*/
int getdata = *ptr//「*」星號就是用來解引用的
int idata = 24;
int *ptr = &idata;//定義乙個指標指向idata
/**這裡就是對指標ptr解引用
解引用之後得到ptr所指向的結構,也就是idata,賦值給getdata
*/int getdata = *ptr//「*」星號就是用來解引用的
一級指標:
c/c++中,變數或者結構都有乙個作用域。
要想在作用域b中修改作用域a中的非指標變數的值(比如 int 資料),就必須將該變數的指標傳入到作用域b中,
然後對指標解引用,然後作出任何修改都會反饋到該指標所指向的資料,否則值傳遞無法反饋修改結果,即修改是無效的。
view plaincopy to clipboardprint?
//version 1
void swap(int param1, int param2)
void funca()
//version 1
void swap(int param1, int param2)
void funca()
上面version1**,作用於funca中的變數直接值傳遞到作用域swap中,由於param1,param2的作用域僅限於swap。
所以,對param1, param2的任何修改都不會反饋到funca中,所以,a和b不會有任何變化。
所以,為了使非指標變數的值能夠在不同的作用域中進行修改並反饋結果到不同域中,那就是用一級指標(為了區別後面要重點講述的雙指標)吧,然後對指標解引用,之後修改的任何結果都會被反饋到不同的域中。
view plaincopy to clipboardprint?
//version 2
/**
對指標ptr1和ptr2解引用之後,作出的任何修改都會反饋到指標所指向的資料中去
*/
void swap(int *ptr1, int *ptr2)
void funca()
//version 2
/**對指標ptr1和ptr2解引用之後,作出的任何修改都會反饋到指標所指向的資料中去
*/void swap(int *ptr1, int *ptr2)
void funca()
上面version 2中,就是用了一級指標,對指標解引用之後,對其作出的任何修改都會反饋到指標所指向的資料。
所以,a和b的資料發生了變化。
雙指標
view plaincopy to clipboardprint?
//version 3
/**
getbufer函式想讓getmemory函式申請一塊記憶體並將記憶體起始指標賦值給
buffer這個指標
*/
void getmemory(char *ptr)
void getbuffer()
//version 3
/**getbufer函式想讓getmemory函式申請一塊記憶體並將記憶體起始指標賦值給
buffer這個指標
*/void getmemory(char *ptr)
void getbuffer()
上面version 3的**,我們想要修改buffer本身這個指標的值,但是getmemory(buffer)之後,buffer的值還是null,並不是所希望的那個molloc之後堆中那個起始位址。
分析如下:
ptr的作用於在getmemory中,雖然我們傳入了buffer這個指標,但是由於ptr是區域性變數,對ptr做修改無法反饋到getbuffer域中
所以,為了使指標變數的值(不是指標變數所指向的值)能夠在不同作用域中進行修改並反饋修改結果,使用雙指標吧,然後傳入需要修改的指標的位址,然後對解引用作出的任何修改都將反饋到該指標。
雙指標定義和申明:
int **p從這個申明中就可以知道,指標的指標,p所指向的值也是乙個指標,即p指向的值也是乙個位址。
然後對p解引用: *p
之後,對*p的任何操作都將反饋到p所指向的位址的值,從而達到對指標本省的修改
view plaincopy to clipboardprint?
//version 4
void getmemory(char **p)
void getbuffer()
//version 4
void getmemory(char **p)
void getbuffer()
對指向非指標變數的指標[指標的內容是非指標變數的位址](其實就是該變數的位址)進行解引用,作出的修改可以反饋到該指標所指向的值,這裡的值是非指標變數。
對指向指標變數的指標[指標的內容指標變數的位址]進行解引用,作出的任何修改可以反饋到該指標所指向的值,這裡這個值是指標變數本身的值(不是指向的值)。
綜合1和2可以得出乙個結論:對解引用之後的任何操作,都將反饋給該指標所指向的值。而這個值可以分為指標變數和非指標變數。
什麼時候使用雙指標?
回答:當我們需要修改指標變數本身的值的時候,可以使用雙指標
很多情況下,雙指標都可以通過其他途徑,比如使用return來反饋結果。
再談雙指標
再談雙指標 之前我寫過一篇部落格 深入理解雙指標 最近也再次重溫 c primer 讀到指標那一章節的時候,度c c 指標又有了新的領悟。c primer 中強調了乙個指標解引用的概念。究竟什麼是解引用呢?為了解釋解引用這個概念,我引用 c primer 中的一段話 when we derefere...
深入理解雙指標
對於c語言的引數傳遞都是值傳遞,當傳傳遞乙個指標給函式的時,其實質上還是值傳遞,除非使用雙指標。在講雙指標之前,還是先講講關於c語言函式呼叫的本質。函 數呼叫操作包括從一塊 到另一塊 之間的雙向資料傳遞和執行控制轉移。資料傳遞通過函式引數和返回值來進行,包括區域性變數的空間分配與 都是通過 棧來實現...
寒假刷雙指標《雙指標》
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...