0

奇妙な問題に遭遇しました。C++ の場合

char s[]="123abc89";
cout<<s[0]<<endl;  //1  it is right
cout<<&s[0]<<endl; // I can't understand why it is "123abc89"

よろしくお願いします。

4

2 に答える 2

6

s[0]文字配列の最初の要素です。&s[0]配列のアドレスと同じ、最初の要素のアドレスです。文字配列の開始アドレスを指定すると、次の operator<< のオーバーロードをstd::cout使用して、そのアドレスから始まる文字列全体を出力します。

// prints the c-style string whose starting address is "s"
ostream& operator<< (ostream& os, const char* s);

文字配列の開始アドレスを出力したい場合、1 つの方法は次のとおりです。

// std::hex is optional. It prints the address in hexadecimal format.  
cout<< std::hex << static_cast<void*>(&s[0]) << std::endl;

これは、代わりに operator<< の別のオーバーロードを使用します。

// prints the value of a pointer itself
ostream& operator<< (const void* val);
于 2013-09-02T00:42:58.653 に答える
0

C(およびC ++)が文字列を処理する方法の内部に遭遇しています(C ++の std::string ではありません)。

文字列は、その最初の文字へのポインターによって参照されます。これを示すコードは次のとおりです。

char *ptr;

ptr = "hello\n";

printf("%s\n", ptr);
ptr++;
printf("%s\n", ptr);
于 2013-09-02T00:46:11.883 に答える