剛學(xué)C++那會(huì),真的是對(duì)字符串頭痛了好久,就是后面自己一不小心還是容易在字符串上犯錯(cuò)誤,自己覺(jué)得這里就是一個(gè)大坑,在看完了c++ primer對(duì)于字符串的描述之后感覺(jué)自己對(duì)于字符串已經(jīng)沒(méi)有那種遙不可及的神秘感了,所以還是C++primer大法好。言歸正傳,該介紹一下字符串的內(nèi)容了。
1.字符串
字符作為一種基本的數(shù)據(jù)類(lèi)型,但是實(shí)際中確實(shí)字符串用的更多,但比較坑爹的就是C++中是沒(méi)有專門(mén)為字符串寫(xiě)一個(gè)基本的數(shù)據(jù)類(lèi)型的。但是C++對(duì)此的不久也是不少的,比如C++是有一個(gè)C-style string的說(shuō)法的,和字符數(shù)組有一點(diǎn)不一樣的。
char arr1[11] = "HelloWorld"
char arr2[10]={'H','e','l','l','W','o','r','l','d'};//not a string
char arr3[11]={'H','e','l','l','W','o','r','l','d','\0'};//the same string as arr1.
我記得很清楚的一句話說(shuō)明了數(shù)組和字符串的區(qū)別就是(自己的理解,不是原話)
當(dāng)你把一個(gè)數(shù)組傳給函數(shù)的時(shí)候,你只給一個(gè) 數(shù)組名是不夠的(也就四數(shù)組的地址)因?yàn)槟悴恢罃?shù)組的長(zhǎng)度,你是不能夠放心的對(duì)數(shù)組進(jìn)行操作的,所以往往還要傳一個(gè)數(shù)組長(zhǎng)度的整數(shù),但是對(duì)于一個(gè)string來(lái)說(shuō)就不同了,傳一個(gè)名字就能夠獲取這個(gè)string的信息,因?yàn)镃++規(guī)定了string的結(jié)尾都是'\0',所以函數(shù)操作string不需要他的長(zhǎng)度,只需要通過(guò)'\0'來(lái)控制
而對(duì)于數(shù)組的操作肯定就少不了相應(yīng)指針的幫忙,所以就有了字符指針
char *p1 = arr;//一開(kāi)始還會(huì)覺(jué)得奇怪?jǐn)?shù)組名是指針,但是后面學(xué)的越多,就覺(jué)得沒(méi)什么了,甚至還有點(diǎn)巧妙
重點(diǎn)來(lái)了,就是對(duì)于指針的運(yùn)算,開(kāi)始的時(shí)候真的讓人頭昏
using namespace std;
int main()
{
char arr1[12] = "HelloWorld";
char *p1 = arr;
cout<<*p1<<endl;
p1++;
cout<<*p1<<"at"<<p1<<endl;
char **p2 = &arr;
p2++;
cout<<*p2<<"at"<<p2<<endl;//dangerous
}
輸出的結(jié)果可能會(huì)讓你覺(jué)得神奇(如果你以前沒(méi)學(xué)過(guò)的話)
對(duì)于&符號(hào)作用于一個(gè)數(shù)組名,其實(shí)是一種指向指針的指針。
對(duì)于這個(gè)問(wèn)題,C++primer作了一個(gè)比較好的解釋,就是*是相當(dāng)于把一個(gè)指針降低了一個(gè)等級(jí),而&取址符相當(dāng)于把指針升了一個(gè)等級(jí)。例如題中p1=&arr;把p1定義為一個(gè)指向整個(gè)數(shù)組的一個(gè)指針對(duì)象,而之前的p1=arr;是把p1定義為一個(gè)指向數(shù)組元素的指針對(duì)象。對(duì)應(yīng)++號(hào)跳過(guò)指針指向的一個(gè)最小指向?qū)ο蟆?/p>
2.字符串輸出
c++中對(duì)于字符數(shù)組的輸出仿佛是別有用心。一開(kāi)始的時(shí)候都會(huì)感覺(jué)有點(diǎn)奇怪。
char word[] = "helloworld";
char *p1 = word;
cout<<word<<endl;
cout<<*p1<<endl;
cout<<p1<<endl;
結(jié)果是
helloworld
helloworld