C/C++中字元指標數組及指向指標的指標的含義

來源:互聯網
上載者:User
  

        就指向指標的指標,很早以前在說指標的時候說過,但後來發現很多人還是比較難以理解,這一次我們再次仔細說一說指向指標的指標。

  先看下面的代碼,注意看代碼中的註解:

#include <iostream> 
#include <string> 
using namespace std; 
 
void print_char(char* array[],int len);//函數原形聲明 
 
void main(void)   

//-----------------------------段1----------------------------------------- 
    char *a[]={"abc","cde","fgh"};//字元指標數組 
    char* *b=a;//定義一個指向指標的指標,並賦予指標數組首地址所指向的第一個字串的地址也就是abc/0字串的首地址 
    cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl; 
//------------------------------------------------------------------------- 
 
//-----------------------------段2----------------------------------------- 
    char* test[]={"abc","cde","fgh"};//注意這裡是引號,表示是字串,以後的地址每加1就是加4位(在32位系統上) 
    int num=sizeof(test)/sizeof(char*);//計算字串個數 
    print_char(test,num); 
    cin.get(); 
//------------------------------------------------------------------------- 

 
void print_char(char* array[],int len)//當調用的時候傳遞進來的不是數組,而是字元指標他每加1也就是加上sizeof(char*)的長度 

    for(int i=0;i<len;i++) 
    { 
        cout<<*array++<<endl; 
    } 
}

  下面我們來仔細說明一下字元指標數組和指向指標的指標,段1中的程式是下面的樣子:

char *a[]={"abc","cde","fgh"}; 
char* *b=a; 
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  char *a[]定義了一個指標數組,注意不是char[], char[]是不能同時初始化為三個字元的,定義以後的a[]其實內部有三個記憶體位置,分別儲存了abc/0,cde/0,fgh/0,三個字串的起始地址,而這三個位置的記憶體位址卻不是這三個字串的起始地址,在這個例子中a[]是儲存在棧空間內的,而三個字串卻是儲存在靜態記憶體空間內的const地區中的,接下去我們看到了char* *b=a;這裡是定義了一個指向指標的指標,如果你寫成char *b=a;那麼是錯誤的,因為編譯器會返回一個無法將char* *[3]轉換給char *的錯誤,b=a的賦值,實際上是把a的首地址賦給了b,由於b是一個指向指標的指標,程式的輸出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;

  結果是

abc
cde
fgh

  可以看出每一次記憶體位址的+1操作事實上是一次加sizeof(char*)的操作,我們在32位的系統中sizeof(char*)的長度是4,所以每加1也就是+4,實際上是*a[]內部三個位置的+1,所以*(b+1)的結果自然就是cde了,我們這時候可能會問,為什麼輸出是cde而不是c一個呢?答案是這樣的,在c++中,輸出字元指標就是輸出字串,程式會自動在遇到/0後停止.

  我們最後分析一下段2中的代碼,段2中我們調用了print_array()這個函數,這個函數中形式參數是char *array[]和代碼中的char *test[]一樣,同為字元指標,當你把參數傳遞過來的時候,事實上不是把數組內容傳遞過來,test的首地址傳遞了進來,由於array是指標,所以在記憶體中它在棧區,具有變數一樣的性質,可以為左值,所以我們輸出寫成了,cout<<*array++<<endl;當然我們也可以改寫為cout<<array[i]<<endl,這裡在迴圈中的每次加1操作和段1代碼總的道理是一樣的,注意看下面的圖!

  到這裡這兩個非常重要的知識點我們都說完了,說歸說,要想透徹理解希望讀者多動手,多觀察,熟能生巧。

  下面是記憶體結構:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.