小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

再談雙指針

 orion360doc 2011-01-19

 再談雙指針 收藏 

再談雙指針

       之前我寫過一篇博客《深入理解雙指針》,最近也再次重溫《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)。

舉個例子:

  1. int idata = 24;  
  2. int *ptr = &idata;//定義一個指針指向idata  
  3.   
  4. /**這里就是對指針ptr解引用 
  5.    解引用之后得到ptr所指向的結(jié)構(gòu),也就是idata,賦值給getdata 
  6. */  
  7. int getdata = *ptr//“*”星號就是用來解引用的  

 

  • 一級指針:

C/C++中,變量或者結(jié)構(gòu)都有一個作用域。

要想在作用域B中修改作用域A中的非指針變量的值(比如 int 數(shù)據(jù)),就必須將該變量的指針傳入到作用域B中,

然后對指針解引用,然后作出任何修改都會反饋到該指針所指向的數(shù)據(jù),否則值傳遞無法反饋修改結(jié)果,即修改是無效的。

  1. //version 1  
  2. void swap(int param1, int param2){  
  3.     int tmp = param1;  
  4.     param1 = param2;  
  5.     param2 = tmp;  
  6. }  
  7. void funcA(){  
  8.       
  9.     int a = 24;  
  10.     int b = 12;  
  11.     swap(a, b);  
  12. }  

 

上面version1代碼,作用于funcA中的變量直接值傳遞到作用域swap中,由于param1,param2的作用域僅限于swap。

所以,對param1, param2的任何修改都不會反饋到funcA中,所以,a和b不會有任何變化。

所以,為了使非指針變量的值能夠在不同的作用域中進行修改并反饋結(jié)果到不同域中,那就是用一級指針(為了區(qū)別后面要重點講述的雙指針)吧,然后對指針解引用,之后修改的任何結(jié)果都會被反饋到不同的域中。

  1. //version 2  
  2. /** 
  3. 對指針ptr1和ptr2解引用之后,作出的任何修改都會反饋到指針所指向的數(shù)據(jù)中去 
  4. */  
  5. void swap(int *ptr1, int *ptr2){  
  6.     int tmp = *ptr1;  
  7.     *ptr1 = *ptr2;  
  8.     *ptr2 = tmp;  
  9. }  
  10. void funcA(){  
  11.     int a = 24;  
  12.     int b = 12;  
  13.     swap(&a, &b)//傳入a和b的指針  
  14. }  

 

上面version 2中,就是用了一級指針,對指針解引用之后,對其作出的任何修改都會反饋到指針所指向的數(shù)據(jù)。

所以,a和b的數(shù)據(jù)發(fā)生了變化。

  • 雙指針

  1. //version 3  
  2. /** 
  3. getbufer函數(shù)想讓getmemory函數(shù)申請一塊內(nèi)存并將內(nèi)存起始指針賦值給 
  4. buffer這個指針 
  5. */  
  6. void getmemory(char *ptr){  
  7.     ptr = (char *)malloc(20);//這個地方對ptr解引用沒有任何意義。因為我們是為了修改指針本身,而不是修改指針所指向的值  
  8.                       
  9. }   
  10. void getbuffer(){  
  11.     char *buffer = NULL;  
  12.     getmemory(buffer);  
  13. }  

 

上面version 3的代碼,我們想要修改buffer本身這個指針的值,但是getmemory(buffer)之后,buffer的值還是NULL,并不是所希望的那個molloc之后堆中那個起始地址。

分析如下:

ptr的作用于在getmemory中,雖然我們傳入了buffer這個指針,但是由于ptr是局部變量,對ptr做修改無法反饋到getbuffer域中

所以,為了使指針變量的值(不是指針變量所指向的值)能夠在不同作用域中進行修改并反饋修改結(jié)果,使用雙指針吧,然后傳入需要修改的指針的地址,然后對解引用作出的任何修改都將反饋到該指針。

雙指針定義和申明:

int **p從這個申明中就可以知道,指針的指針,p所指向的值也是一個指針,即p指向的值也是一個地址。

然后對P解引用: *p

之后,對*p的任何操作都將反饋到p所指向的地址的值,從而達到對指針本省的修改

  1. //version 4  
  2.   
  3. void getmemory(char **p){  
  4.     *p = (char *)malloc(10);  
  5. }  
  6. void getbuffer(){  
  7.     char *buffer;  
  8.     getmemory(&buffer);  
  9. }  

 

  1. 對指向非指針變量的指針[指針的內(nèi)容是非指針變量的地址](其實就是該變量的地址)進行解引用,作出的修改可以反饋到該指針所指向的值,這里的值是非指針變量。
  2. 對指向指針變量的指針[指針的內(nèi)容指針變量的地址]進行解引用,作出的任何修改可以反饋到該指針所指向的值,這里這個值是指針變量本身的值(不是指向的值)。

綜合1和2可以得出一個結(jié)論:對解引用之后的任何操作,都將反饋給該指針所指向的值。而這個值可以分為指針變量和非指針變量。

  • 什么時候使用雙指針?

      回答:當我們需要修改指針變量本身的值的時候,可以使用雙指針

很多情況下,雙指針都可以通過其他途徑,比如使用return來反饋結(jié)果。

更多理論,請參看我的另一篇博客《深入理解雙指針》

版權(quán)申明:
轉(zhuǎn)載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2011/01/14/6138438.aspx
并請聯(lián)系譚海燕本人或者前往譚海燕個人主頁留言

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多