std::string.c_str()
(const char *) 値を返します。私はグーグルで、次のことができることを発見しました:
std::string myString = "Hello World";
char *buf = &myString[0];
これはどのように可能ですか?&myString[0]
は type のオブジェクトですがstd::string
、これはどのように機能するのでしょうか?
&myString[0]
型のオブジェクトですstd::string
いいえ、そうではありません。myString[0]
文字列の最初の文字への参照です。&myString[0]
その文字へのポインタです。演算子の優先順位は、 を意味するものであり、 を意味するものでは&(myString[0])
ありません(&mystring)[0]
。
この方法でアクセスすると、文字列がゼロで終了するという保証がないことに注意してください。したがって、ゼロで終わる文字列を期待する C スタイルの関数でこれを使用すると、未定義の動作に依存することになります。
const
と の非const
オーバーロードがありstd::string::operator[]( size_type pos )
、非 const バージョンは a を返すためchar&
、次のようなことができます
std::string s("Hello");
s[0] = 'Y';
s[0]
を返すchar&
ので、&s[0]
は element のアドレスであることに注意してくださいs[0]
。そのアドレスを に割り当てることができますchar*
。このポインターを誤用しないように注意してください。
演算子の優先順位に関係しています。演算子は[]
アドレス演算子よりも優先順位が高い&
ため、アドレス演算子は文字列関数によって返される文字参照で機能しoperator[]
ます。
オーバーロードされた演算子[]
( std::string::char& operator[] (size_t pos) ) は、インデックスの文字への参照を返します。あなたはそのような文字参照のアドレスを取っていますが、それは問題ありません。
したがって、myString[0]
戻り値の型はstd::string
butではありませんchar&
。
そうする理由はありません。あなたは直接行うことができます -
myString[0] = 'h';
The std::string methods c_str()
and operator[]
are two diferent methods, which return two different types.
The method c_str() does indeed return a const char*
.
const char* c_str() const;
However, the method operator[] returns instead a reference to a char. When you take the address of it, you get the address of a char.
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
このstd::string
型にはoperator[]
、文字列内の各文字にインデックスを付けることができる があります。式myString[0]
は、文字列の最初の文字への (変更可能な) 参照です。そのアドレスを取得すると、配列の最初の文字へのポインターが取得されます。
あなたは間違っている。タイプで&myString[0]
はなく、タイプです。std::string
char *
[]
演算子は優先順位が高くoperator[]
、 への参照を返します。char
そのアドレス (&
演算子) の型はchar *
です。