一個面試題,很基礎,卻有很多東西可以挖掘+char*+char[]+與char*[]++char(*[])


先給出題目,問輸出多少:

#include <iostream>
using namespace std;

int main()
{
    char* str[]={"Welcome","to",Fortemedia", "Nanjing"};
    char **p=str+1;
    str[0]=(*p++)+2;
    str[1]=*(p+1);
    str[2]=p[1]+3;
    str[3]=p[0]+(str[2]-str[1]);
    cout<<str[0]<<str[1]<<str[2]<<str[3]<<endl;
}

1、先糾正自己幾個語法上的錯誤思想
       看下面這個測試程序:

#include <iostream>
using namespace std;

int main()
{
    char str[]="Welcome";
    char* p = str;
    cout<<++str<<endl;
    cout<<++str<<endl;
    cout<<++str<<endl;
    cout<<++p<<endl;
    cout<<++p<<endl;
    cout<<++p<<endl;
}

        這個程序編譯是通不過的,問題出在

    cout<<++str<<endl;
    cout<<++str<<endl;
    cout<<++str<<endl;

        問題出在這幾行,str是char[]類型的,不是指針類型,不支持自增自減。但是str存的是字符串首地址,賦給p指針之後,可以通過p自增自減截取子串。

        再看這個測試程序:

    int main()
    {
       char str[]="Welcome";
       char* p = str + 1;
       str = str + 1; //出錯提示爲:“=”: 無法從“char *”轉換爲“char [8]”
        cout<<++p<<endl;
       cout<<++p<<endl;
       cout<<++p<<endl;
    }

         原來,str被隱式轉換爲char*類型,但是相反的過程不支持,這點保證了str的內容始終指向字符串在常量區中的首地址。

2、char*與char[]的區別

       摘自網上一段話,自己做了修改

       char *Str;Str="abcdef";       Str指向常量區,不能更改字符串的值       char Str[]="abcdef";       在棧區,可以改變

       首先第一個指針形式的str指向一個字符串,這樣指向以後就不能通過str對abcdef這個字符串修改了,但是你可以給str用別的字符串再賦值,這樣他就指向了別的字符串,

       如: char *Str = "abc";

                 Str = "def";

       但是一旦指向某個字符串,就不能通過這個指針對字符串修改了。

       第二種數組形式的str,其實數組名就是指針常量,也就是說一旦他初始化了,它指向的地址就固定了,就不能再用別的字符串賦值了(這就不同於指針形式的str),但是  這個地址裏放什麼是可以改變的(指針形式的就不能改變了),比如說初始化之後在通過cin>>str改變數組的內容還是沒有問題的。

3、char *str[]的類型問題

        str是一個char*[]類型,與char[]一樣,同樣指向常量區中的首地址,該塊內存中順序存放了n的char*類型的指針,如上題就是4個地址,第一個地址指向"Welcome"字符串的首地址、依次類推。所以:

    char* str[]={"Welcome","to","Fortemedia", "Nanjing"};
    char *a="Welcome";
    char *b="to";
    char *c="Fortemedia";
    char *d="Nanjing";
    char* str[]={a,b,c,d};

         這兩端是等效的。

         可以這麼看 char* str[] ,即str是一個數組,數組內的元素類型是char*

4、回到面試題也就不難理解了

        char **p=str+1;是取到了指向str[1]的指針

        str[0]=(*p++)+2;是先取p的內容,內容即是"to"字符串首字母的地址,然後+2,指向了第三個字符,即'\0',在p++,此時p爲指向str[2]的指針

        str[1]=*(p+1);    p先加1,指向了str[3]再取內容,返回的是"Nanjing"的首字母地址

        str[2]=p[1]+3;  等效於 str[2] = *(p+1) + 3;  p爲指向str[2]的指針  +1之後爲指向str[3]的指針,取內容返回"Nanjing"首字母地址,+3之後指向"Nanjing"字符串中j的地址

        str[3]=p[0]+(str[2]-str[1]); str[2]爲指向"Nanjing"字符串中j的地址,str[1]爲"Nanjing"首字母地址,相減返回3,p[0]指向了str[2],str[]此時爲指向"Nanjing"字符串中j的

                                                     指針,+3之後指向了'g'

        輸出結果爲:Nanjingjingg

        輸出str[0]爲空

        輸出str[1]爲Nanjing

        輸出str[2]爲jing

        輸出str[3]爲g

 

5、char*str[]與char(*str[])等效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章