C++中“指標的指標”用法

來源:互聯網
上載者:User
C++中“指標的指標”用法

出處:http://blog.chinaunix.net/space.php?uid=20498030&do=blog&cuid=274854

 好多人在學習C++,但對C++中的指標的指標很困惑,我就我認識拿來跟大家分享一下。

    系統使用4B的記憶體來存一個指標,也就是說我們申請了一個指標比如int *a=NULL,那麼系統將為你分配4B的記憶體,而我們如果要再定義一個變數來存放指標的的記憶體位址,那麼就需要指標的指標,比如,int **b=&a;

    “指標的指標”最常用的地方是在函數傳值上,以及數組使用,其他用的地方我還沒遇到。

    先說函數。
     記憶體的分配方式有3種:
    1 . 從靜態儲存區配置;
    2 . 從棧分配;
    3 . 從堆上分配,new ,malloc都是從這裡分配的記憶體。

    函數的執行是在棧上執行的,函數中的局部變數都是在棧上分配的,在函數執行結束返回時這些變數都被銷毀了,所以在函數返回的時候千萬不要返回棧上的資料指標,要不然返回的指標所指向的資料都是垃圾資料。
    一般函數的傳回值就夠我們使用了,但是如果我們需要返回兩個以上的參數,或者函數的傳回值有其他用途(比如返回錯誤碼),我們的函數要傳回值就要從參數獲得了,這樣的話我們要定義一個變數,然後把這個變數的地址傳給函數,在函數的執行過程中對這個地址的內容進行修改,因為這個地址不在函數所在的棧,函數返回時它不會被銷毀,這樣就達到傳回值的目的。

    比如一個函數是這樣定義的:

    BOOL func(int *a)    {      *a = 2;      return TRUE;    }

    函數的調用:

     int nAge;     BOOL nAge = func(&nAge); 

    但是如果本來變數是一個指標,比如 int *pAge = NULL; 那麼要修改指標的值,就要把指標的地址傳進函數:
    int *pAge;
    BOOL nAge = func(&pAge);
    func函數就應該這樣寫了:
    BOOL func(int **a)
    {
      // a 為指標的指標,*a為指標,**a為指標指向的地方,一個int值
      *a = 2;  //這是給指標賦值,
      **a = 3; //這是給指標指向的地方填值
      return TRUE;
    } // 這個函數不要使用,它將記憶體位址為2的地方4個位元組賦了個3 ……
 
    當然了,一個int的變數用不著指標的指標,但是如果是一個鏈表的節點,鏈表的節點是用指標指著的,在函數中要對這個指標修改,就要傳進指標的地址,那麼這個指標的地址就要用指標的指標來存放了。

   
    總之一句話,指標的指標就是存放了一個指標的地址的變數,它是一個變數,它佔用4B的儲存空間,一個實實在在的東西。它的用處是在函數中用來傳出來指標值的。
    如果各位還發現有什麼其他用處,大家就踴躍跟貼,呵呵,謝謝!

    指標的指標已經夠用了,至於指標的指標的指標,好象沒什麼用處,不用說了。

    另外如果大家對COM有興趣的話,就會發現COM的函數很多都用的是雙星**參數,它們都是傳出這個意思。
    以上僅是我個人認識,如果有錯誤,請大家提出來共同學習!  :)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.