先給出題目,問輸出多少:
#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[])等效