std::string.c_str()
返回一個(const char *)值。我谷歌搜索,發現我可以做到以下幾點:std :: string gets(char *)而不是(const char *)
std::string myString = "Hello World";
char *buf = &myString[0];
這怎麼可能? &myString[0]
是std::string
類型的對象,所以它如何工作?
std::string.c_str()
返回一個(const char *)值。我谷歌搜索,發現我可以做到以下幾點:std :: string gets(char *)而不是(const char *)
std::string myString = "Hello World";
char *buf = &myString[0];
這怎麼可能? &myString[0]
是std::string
類型的對象,所以它如何工作?
&myString[0]
是類型std::string
否的對象事實並非如此。 myString[0]
是對字符串的第一個字符的引用; &myString[0]
是一個指向那個角色的指針。運營商的優先級是這樣的,即它意味着&(myString[0])
而不是(&mystring)[0]
。
請注意,以這種方式訪問,不能保證字符串將以零終止;所以如果你在一個C風格的函數中使用它,這個函數需要一個以零結尾的字符串,那麼你將依賴未定義的行爲。
它與operator precedence有關。 []
運算符的優先級高於運算符地址&
,所以運算符地址對字符串operator[]
函數返回的字符引用起作用。
+1表示優先。從語法看這是一個不同的角度。 – Nawaz
你錯了。 &myString[0]
不是std::string
類型,它是char *
類型。
的[]
操作者具有較高的優先級和operator[]
返回到char
的引用,其地址(&
操作者)是char *
類型。
std::string
類型有一個operator[]
,它允許索引字符串中的每個字符。表達式myString[0]
是對字符串的第一個字符的(可修改的)引用。如果你採用這個地址,你會得到一個指向數組中第一個字符的指針。
運算符[]
(std::string::char& operator[] (size_t pos))重載會返回索引處字符的引用。你正在採取這種字符引用的地址,這很好。
因此,myString[0]
返回類型不是std::string
而是char&
。
沒有理由這樣做。您可以直接做 -
myString[0] = 'h';
的的std :: string方法c_str()
和operator[]
是2 diferent方法,它返回兩個不同的類型。
方法c_str()確實返回const char*
。
const char* c_str() const;
但是,方法operator []返回char的引用。當你把它的地址,你得到一個字符的地址。
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
有const
和std::string::operator[](size_type pos)
非const
重載,和非const版本返回char&
,所以你可以做這樣的事情
std::string s("Hello");
s[0] = 'Y';
需要注意的是,由於s[0]
返回char&
,然後&s[0]
是元素地址s[0]
。您可以將該地址分配給char*
。這是由你不要誤用這個指針。
「不保證字符串將被零終止」在C++ 03中爲true,但C++ 11確實有保證。 –
@TonyD:不,C++ 11並不保證連續存儲的字符在它們後面會有一個零;只是'str [size]'會給出一個零值的引用,'c_str()'的結果將被終止。 –
@MikeSeymour:我想知道爲什麼規範使它變得如此複雜。只需保存一個字節? – Nawaz