2

std::string.c_str()(const char *) 値を返します。私はグーグルで、次のことができることを発見しました:

std::string myString = "Hello World";
char *buf = &myString[0];

これはどのように可能ですか?&myString[0]は type のオブジェクトですがstd::string、これはどのように機能するのでしょうか?

4

7 に答える 7

9

&myString[0]型のオブジェクトですstd::string

いいえ、そうではありません。myString[0]文字列の最初の文字への参照です。&myString[0]その文字へのポインタです。演算子の優先順位は、 を意味するものであり、 を意味するものでは&(myString[0])ありません(&mystring)[0]

この方法でアクセスすると、文字列がゼロで終了するという保証がないことに注意してください。したがって、ゼロで終わる文字列を期待する C スタイルの関数でこれを使用すると、未定義の動作に依存することになります。

于 2013-07-23T14:32:00.183 に答える
4

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*。このポインターを誤用しないように注意してください。

于 2013-07-23T14:32:17.043 に答える
3

演算子の優先順位に関係しています。演算子は[]アドレス演算子よりも優先順位が高い&ため、アドレス演算子は文字列関数によって返される文字参照で機能しoperator[]ます。

于 2013-07-23T14:29:56.987 に答える
2

オーバーロードされた演算子[]( std::string::char& operator[] (size_t pos) ) は、インデックスの文字への参照を返します。あなたはそのような文字参照のアドレスを取っていますが、それは問題ありません。

したがって、myString[0]戻り値の型はstd::stringbutではありませんchar&

そうする理由はありません。あなたは直接行うことができます -

myString[0] = 'h';
于 2013-07-23T14:31:37.013 に答える
2

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;
于 2013-07-23T14:31:53.787 に答える
1

このstd::string型にはoperator[]、文字列内の各文字にインデックスを付けることができる があります。式myString[0]は、文字列の最初の文字への (変更可能な) 参照です。そのアドレスを取得すると、配列の最初の文字へのポインターが取得されます。

于 2013-07-23T14:31:14.440 に答える
1

あなたは間違っている。タイプで&myString[0]はなく、タイプです。std::stringchar *

[]演算子は優先順位が高くoperator[]、 への参照を返します。charそのアドレス (&演算子) の型はchar *です。

于 2013-07-23T14:30:13.160 に答える