2012-07-27 156 views
2

我目前正在分析char和字符串數據類型。對於char數據類型,剪斷下面的代碼保存好:將值賦給字符串指針

char value = 'a'; 
char value1[] = "Good"; 
char* value2 = "Good"; 

對於字符串,

string strValue = "Good"; 
string strVal[3] = {"Good","Better","Best"}; 

但下面的分配將引發編譯錯誤:

"error: scalar object strPtr requires one element in initializer"

string* strPtr = {"Good","Better","Best"} 

所以,最初如何將值分配到string*以上?

感謝, Udhai

+3

'char * value2 =「不好」;' - 通過語言設計中的錯誤,它是允許的,但它不應該是,它已被棄用。字符串文字駐留在只讀存儲器中,並且在該語句中,您正在爲其中的第一個元素指定一個非const指針。所以如果你嘗試修改字符串,它會編譯,但它在運行時不起作用。那很糟。 – 2012-07-27 06:22:44

+0

指針指向一個地址;對?因此,當你爲一個指針「賦值」的時候,你必須首先去引用它,然後你可以在指針所指向的地址處真正處理數據。試圖給一個未被引用的指針指定一個值就是說你試圖改變你指向的數據的地址。你給一個'string *'分配的是一個已經定義好的,或者至少是被聲明的'string'。 – ChiefTwoPencils 2012-07-27 06:29:50

+0

在此期間沒有固定過嗎?我現在認爲(C++ 0x或者更高版本的標準)字符串文字總是有const char *類型(並且這會產生編譯錯誤)。 – Axel 2012-07-27 06:32:22

回答

3

指針不是數組,那麼你爲什麼要否則假裝?你可以這樣做

string strVal[3] = {"Good","Better","Best"}; 
string* strPtr = strVal; 
-1

我想你是指std::string

正確的方法是

std::string *s(new std::string); 
// or 
std::string *s = new std::string; 

如果你想有一個指向字符串的指針和

std::string s_arr[3] = {"Good","Better","Best"}; 
string* str_p = strVal; 

如果你想有一個指針指向字符串數組的開始。

+0

'...(新的std :: string;'你錯過了嗎?)? – ChiefTwoPencils 2012-07-27 06:16:03

+0

是的。我會糾正這一點。謝謝 – steffen 2012-07-27 06:22:39

0

這工作:

std::string* strPtr{new std::string[3]{"Good","Better","Best"}}; 

這也編譯

std::string* strPtr{(std::string[3]){"Good","Better","Best"}}; 

但結合指針到一個臨時的,所以請不要那樣做。

+0

在第一個示例中,您在堆上創建陣列,而不是堆棧,並且如果不希望內存泄漏,則必須手動刪除。 – Axel 2012-07-27 06:29:51

+0

@Axel:這取決於一生......如果它是一個全球性的,那麼就沒有必要永遠釋放它,因爲全局變量應該一直存在直到程序結束。 – 2012-07-27 13:45:07

+0

確實,但風格不好。 – Axel 2012-07-30 06:30:43