轉(zhuǎn)自:
http://dev.csdn.net/article/17/17508.shtm(只轉(zhuǎn)了一部分)
因?yàn)?C++語(yǔ)言已經(jīng)于1998年被標(biāo)準(zhǔn)化,C++的中堅(jiān)分子在努力推動(dòng)程序員從數(shù)組轉(zhuǎn)到vector時(shí)就沒(méi)什么顧慮了。同樣顯然的情況也發(fā)生于嘗試使開(kāi)發(fā)者從char*指針遷移到string對(duì)象的過(guò)程中。有很好的理由來(lái)做這些轉(zhuǎn)變,包括可以消除常見(jiàn)的編程錯(cuò)誤(參見(jiàn)條款13),而且有機(jī)會(huì)獲得STL算法的全部強(qiáng)大能力(比如參見(jiàn)條款31)。
但是,障礙還是有的,最常見(jiàn)的一個(gè)就是已經(jīng)存在的傳統(tǒng)C風(fēng)格的API接受的是數(shù)組和char*指針,而不是vector和string對(duì)象。這樣的API函數(shù)還將會(huì)存在很長(zhǎng)時(shí)間,如果我們要高效使用STL的話,就必須和它們和平共處。
幸運(yùn)的是,這很容易。如果你有一個(gè)vector對(duì)象v,而你需要得到一個(gè)指向v中數(shù)據(jù)的指針,以使得它可以被當(dāng)作一個(gè)數(shù)組,只要使用&v[0]就可以了。對(duì)于string對(duì)象s,相應(yīng)的咒語(yǔ)是簡(jiǎn)單的s.c_str()。但是是只讀的。如廣告中難懂的條文時(shí)常指出的,必然會(huì)有幾個(gè)限制。
給定一個(gè)
vector<int> v;
表達(dá)式v[0]生產(chǎn)一個(gè)指向vector中第一個(gè)元素的引用,所以,&v[0]是指向那個(gè)首元素的指針。vector中的元素被C++標(biāo)準(zhǔn)限定為存儲(chǔ)在連續(xù)內(nèi)存中,就像是一個(gè)數(shù)組,所以,如果我們想要傳遞v給這樣的C風(fēng)格的API:
void doSomething(const int* pInts, size_t numInts);
我們可以這么做:
doSomething(&v[0], v.size());
也許吧??赡馨?。唯一的問(wèn)題就是,如果v是空的。如果這樣的話,v.size()是0,而&v[0]試圖產(chǎn)生一個(gè)指向根本就不存在的東西的指針。這不是件好事。其結(jié)果未定義。一個(gè)較安全的方法是這樣:
if (!v.empty()) {
doSomething(&v[0], v.size());
}
如果走錯(cuò)路了,你可能會(huì)碰到一些半吊子的人物,他們會(huì)告訴你說(shuō)可以用v.begin()代替&v[0],因?yàn)椋ㄟ@些討厭的家伙將會(huì)告訴你)begin返回指向vector內(nèi)部的迭代器,而對(duì)于vector,其迭代器實(shí)際上是指針。那經(jīng)常是正確的,但正如條款50所說(shuō),并不總是如此,你不該依賴于此。begin的返回類型是iterator,而不是一個(gè)指針,當(dāng)你需要一個(gè)指向vector內(nèi)部數(shù)據(jù)的指針時(shí)絕不該使用begin。如果你基于某些原因決定鍵入v.begin(),就應(yīng)該鍵入&*v.begin(),因?yàn)檫@將會(huì)產(chǎn)生和&v[0]相同的指針,這樣可以讓你有更多的打字機(jī)會(huì)而且讓其他要弄懂你代碼得人感覺(jué)到更晦澀。坦白地說(shuō),如果你正在和告訴你使用v.begin()代替&v[0]的人打交道的話,你該重新考慮一下你的社交圈了。(譯注:在VC6中,如果用v.begin()代替&v[0],編譯器不會(huì)說(shuō)什么,但在VC7和GCC中這么做的話,就會(huì)引發(fā)一個(gè)編譯錯(cuò)誤)
類似從vector上獲取指向內(nèi)部數(shù)據(jù)的指針的方法,對(duì)string不是可靠的,因?yàn)椋?)string中的數(shù)據(jù)并沒(méi)有承諾被存儲(chǔ)在連續(xù)內(nèi)存中,(2)string的內(nèi)部表示形式并沒(méi)承諾以一個(gè)null字符結(jié)束。這解釋了string的成員函數(shù)c_str存在的原因,它返回一個(gè)按C風(fēng)格設(shè)計(jì)指針,指向string的值。因此我們可以這樣傳遞一個(gè)string對(duì)象s給這個(gè)函數(shù),
。。。。。。。。。。。
。。。。。。。。。