再談雙指針
之前我寫過一篇博客《深入理解雙指針》,最近也再次重溫《C++ Primer》讀到指針那一章節(jié)的時候,度C/C++指針又有了新的領(lǐng)悟。
《C++ Primer》中強調(diào)了一個指針解引用的概念。
究竟什么是解引用呢?
為了解釋解引用這個概念,我引用《C++ Primer》中的一段話:
When we dereference a pointer, we obtain the object to which the pointer points
從上面這段話可以看出解引用的對象是指針,當我們對指針解引用的時候,我們得到的是指針所指向的對象。按照C語言的習慣,當我們隊指針解引用的時候,我們得到的是該指針所指向的結(jié)構(gòu)。
舉個例子:
- int idata = 24;
- int *ptr = &idata;
-
-
-
-
- int getdata = *ptr
C/C++中,變量或者結(jié)構(gòu)都有一個作用域。
要想在作用域B中修改作用域A中的非指針變量的值(比如 int 數(shù)據(jù)),就必須將該變量的指針傳入到作用域B中,
然后對指針解引用,然后作出任何修改都會反饋到該指針所指向的數(shù)據(jù),否則值傳遞無法反饋修改結(jié)果,即修改是無效的。
-
- void swap(int param1, int param2){
- int tmp = param1;
- param1 = param2;
- param2 = tmp;
- }
- void funcA(){
-
- int a = 24;
- int b = 12;
- swap(a, b);
- }
上面version1代碼,作用于funcA中的變量直接值傳遞到作用域swap中,由于param1,param2的作用域僅限于swap。
所以,對param1, param2的任何修改都不會反饋到funcA中,所以,a和b不會有任何變化。
所以,為了使非指針變量的值能夠在不同的作用域中進行修改并反饋結(jié)果到不同域中,那就是用一級指針(為了區(qū)別后面要重點講述的雙指針)吧,然后對指針解引用,之后修改的任何結(jié)果都會被反饋到不同的域中。
-
-
-
-
- void swap(int *ptr1, int *ptr2){
- int tmp = *ptr1;
- *ptr1 = *ptr2;
- *ptr2 = tmp;
- }
- void funcA(){
- int a = 24;
- int b = 12;
- swap(&a, &b)
- }
上面version 2中,就是用了一級指針,對指針解引用之后,對其作出的任何修改都會反饋到指針所指向的數(shù)據(jù)。
所以,a和b的數(shù)據(jù)發(fā)生了變化。
-
-
-
-
-
- void getmemory(char *ptr){
- ptr = (char *)malloc(20);
-
- }
- void getbuffer(){
- char *buffer = NULL;
- getmemory(buffer);
- }
上面version 3的代碼,我們想要修改buffer本身這個指針的值,但是getmemory(buffer)之后,buffer的值還是NULL,并不是所希望的那個molloc之后堆中那個起始地址。
分析如下:
ptr的作用于在getmemory中,雖然我們傳入了buffer這個指針,但是由于ptr是局部變量,對ptr做修改無法反饋到getbuffer域中
所以,為了使指針變量的值(不是指針變量所指向的值)能夠在不同作用域中進行修改并反饋修改結(jié)果,使用雙指針吧,然后傳入需要修改的指針的地址,然后對解引用作出的任何修改都將反饋到該指針。
雙指針定義和申明:
int **p從這個申明中就可以知道,指針的指針,p所指向的值也是一個指針,即p指向的值也是一個地址。
然后對P解引用: *p
之后,對*p的任何操作都將反饋到p所指向的地址的值,從而達到對指針本省的修改
-
-
- void getmemory(char **p){
- *p = (char *)malloc(10);
- }
- void getbuffer(){
- char *buffer;
- getmemory(&buffer);
- }
- 對指向非指針變量的指針[指針的內(nèi)容是非指針變量的地址](其實就是該變量的地址)進行解引用,作出的修改可以反饋到該指針所指向的值,這里的值是非指針變量。
- 對指向指針變量的指針[指針的內(nèi)容指針變量的地址]進行解引用,作出的任何修改可以反饋到該指針所指向的值,這里這個值是指針變量本身的值(不是指向的值)。
綜合1和2可以得出一個結(jié)論:對解引用之后的任何操作,都將反饋給該指針所指向的值。而這個值可以分為指針變量和非指針變量。
回答:當我們需要修改指針變量本身的值的時候,可以使用雙指針
很多情況下,雙指針都可以通過其他途徑,比如使用return來反饋結(jié)果。
更多理論,請參看我的另一篇博客《深入理解雙指針》
版權(quán)申明:
轉(zhuǎn)載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2011/01/14/6138438.aspx
并請聯(lián)系譚海燕本人或者前往譚海燕個人主頁留言