1. 程式人生 > >透析string的c_str()函式

透析string的c_str()函式

string定義了與c++和c語言的介面,通過c_str()函式,就能夠得到C風格的字串。它和string物件中儲存的字串有什麼關係呢?我們可以做些實驗來看看這個函式究竟是什麼名堂。

c_str()的返回值是 const char * 型別的指標, 即不能對它指向的值進行修改, 為什麼要設計成返回不能修改所指向的值的指標,原因就是這個指標所指向的記憶體和string物件中存放字串的記憶體是同一片區域,如果你對這片記憶體進行修改,那麼string物件的值也會改變,下面程式碼實驗一下:

int main()
{
	string s = "hello world!";
	const char *p = s.c_str();
	char *p2 = (char *)p;
	p2[0] = 'W';
	cout<<s<<endl;
	
	return 0;
}

結果輸出:Wello world!;

這就說明,p2 和 p 所指向的記憶體和string中存放字串的記憶體是同一片區域, 進一步可以推測,其實string類是在對c_str()所指向的字串進行維護,不允許使用者直接修改字串,當然像上面一個給一個強制轉換也可以實現直接修改,當c++的思路並不推薦這樣操作,因為這樣做會讓使用者擁有更多犯錯誤的機會,這也就是為什麼這個函式返回值是const修飾的原因了。那麼string類為什麼要提供這種操作呢?是因為當在c++程式碼中呼叫c語言函式庫完成某種操作時,需要這樣的字串作為引數。但是對於字串本身操作,我們應該使用string提供的介面。