挑戰(zhàn)30天C++入門(mén)極限:c/c++中的字符指針數(shù)組,指向指針的指針的含義

字號(hào):

就指向指針的指針,很早以前在說(shuō)指針的時(shí)候說(shuō)過(guò),但后來(lái)發(fā)現(xiàn)很多人還是比較難以理解,這一次我們?cè)俅巫屑?xì)說(shuō)一說(shuō)指向指針的指針!
    先看下面的代碼,注意看代碼中的注解!
    //程序作者:管寧
    //站點(diǎn):www.cndev-lab.com
    //所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必出處和作者
    #include
    #include
    usingnamespacestd;
    voidprint_char(char* array[],intlen);//函數(shù)原形聲明
    voidmain(void)
    {
    //-----------------------------段1-----------------------------------------
    char*a[]={"abc","cde","fgh"};//字符指針數(shù)組
    char* *b=a;//定義一個(gè)指向指針的指針,并賦予指針數(shù)組首地址所指向的第一個(gè)字符串的地址也就是abc\0字符串的首地址
    cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)    //-----------------------------段2-----------------------------------------
    char* test[]={"abc","cde","fgh"};//注意這里是引號(hào),表示是字符串,以后的地址每加1就是加4位(在32位系統(tǒng)上)
    intnum=sizeof(test)/sizeof(char*);//計(jì)算字符串個(gè)數(shù)
    print_char(test,num);
    cin.get();
    //-------------------------------------------------------------------------
    }
    voidprint_char(char* array[],intlen)//當(dāng)調(diào)用的時(shí)候傳遞進(jìn)來(lái)的不是數(shù)組,而是字符指針?biāo)考?也就是加上sizeof(char*)的長(zhǎng)度
    {
    for(inti=0;i{
    cout<<*array++<}
    }
    下面我們來(lái)仔細(xì)說(shuō)明一下字符指針數(shù)組和指向指針的指針,段1中的程序是下面的樣子:
    char*a[]={"abc","cde","fgh"};
    char* *b=a;
    cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<
    char *a[]定義了一個(gè)指針數(shù)組,注意不是char[], char[]是不能同時(shí)初始化為三個(gè)字符的,定義以后的a[]其實(shí)內(nèi)部有三個(gè)內(nèi)存位置,分別存儲(chǔ)了abc\0,cde\0,fgh\0,三個(gè)字符串的起始地址,而這三個(gè)位置的內(nèi)存地址卻不是這三個(gè)字符串的起始地址,在這個(gè)例子中a[]是存儲(chǔ)在??臻g內(nèi)的,而三個(gè)字符串卻是存儲(chǔ)在靜態(tài)內(nèi)存空間內(nèi)的const區(qū)域中的,接下去我們看到了char* *b=a;這里是定義了一個(gè)指向指針的指針,如果你寫(xiě)成char *b=a;那么是錯(cuò)誤的,因?yàn)榫幾g器會(huì)返回一個(gè)無(wú)法將char* *[3]轉(zhuǎn)換給char *的錯(cuò)誤,b=a的賦值,實(shí)際上是把a(bǔ)的首地址賦給了b,由于b是一個(gè)指向指針的指針,程序的輸出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<結(jié)果是
    abc
    cde
    fgh
    可以看出每一次內(nèi)存地址的+1操作事實(shí)上是一次加sizeof(char*)的操作,我們?cè)?2位的系統(tǒng)中sizeof(char*)的長(zhǎng)度是4,所以每加1也就是+4,實(shí)際上是*a[]內(nèi)部三個(gè)位置的+1,所以*(b+1)的結(jié)果自然就是cde了,我們這時(shí)候可能會(huì)問(wèn),為什么輸出是cde而不是c一個(gè)呢?答案是這樣的,在c++中,輸出字符指針就是輸出字符串,程序會(huì)自動(dòng)在遇到\0后停止.
    我們最后分析一下段2中的代碼,段2中我們調(diào)用了print_array()這個(gè)函數(shù),這個(gè)函數(shù)中形式參數(shù)是char *array[]和代碼中的char *test[]一樣,同為字符指針,當(dāng)你把參數(shù)傳遞過(guò)來(lái)的時(shí)候,事實(shí)上不是把數(shù)組內(nèi)容傳遞過(guò)來(lái),test的首地址傳遞了進(jìn)來(lái),由于array是指針,所以在內(nèi)存中它在棧區(qū),具有變量一樣的性質(zhì),可以為左值,所以我們輸出寫(xiě)成了,cout<<*array++<
    到這里這兩個(gè)非常重要的知識(shí)點(diǎn)我們都說(shuō)完了,說(shuō)歸說(shuō),要想透徹理解希望讀者多動(dòng)手,多觀察,熟能生巧!