1

http://www.cplusplus.com/reference/string/string/のテキストによると、C++ の文字列ライブラリはクラスであり、単なる「メモリ配列内の文字列」ではありません。詳細を確認するために、次のコードを作成しました。

string s = "abcd";

cout << &s << endl; // This gives an address
cout << s[0] << endl; // This gives 'a'
cout << &s[0] << endl; // This gives "abcd"

いくつか質問があります: 1. C++ の文字列ライブラリはまだシーケンス文字の配列ですか? 2. 文字列内の各文字のアドレスを取得するにはどうすればよいですか? (コードのように、各文字を取得できますが、を使用してそのアドレスを取得することはできません& operator)

4

3 に答える 3

5

これの多く (ほとんど) は、文字列クラス自体に関するものではありません。

std::stringその内容を連続した文字配列として保存します。

&s[0]その配列の先頭のアドレスを生成しますが、char へのポインターを取り、それを文字列として出力するオーバーロードがあります。 std::ostreamoperator<<

文字列内の個々の文字のアドレスを確認したい場合は、それらのアドレスを取得し、アドレスを void へのポインターにキャストする必要があります。void へのポインターを受け取るstd::iostreamオーバーロードもあり、そのオーバーロードには、そのアドレスにある (想定される) 文字列の代わりにアドレスが出力されます。operator<<

編集:デモコード:

#include <iostream>
#include <string>

int main(){
    std::string x("this is a string");

    std::cout << &x[0] << "\n";
    std::cout << (void *)&x[0] << '\n';
    return 0;
}

結果:

this is a string
00481DE0
于 2012-05-01T02:34:45.967 に答える
0

std::string は、基本的に文字のベクトルとして文字列を格納します。basic_stringを参照してください

于 2012-05-01T02:33:57.870 に答える
-1

Stroutrup の本、弦に関する第 20 章、579 ページ (2000 年版) から

From C, C++ inherited the notion of strings as zero terminated arrays of char..... C では、配列の名前は最初の文字のアドレスと同じです。&s[0]そのため、それ自体を渡すのと同じように渡すと、文字列全体が出力されますs

于 2012-05-01T04:07:37.540 に答える