6

char*わからないという基本的な質問があります

char* aString = "Hello Stackoverflow";

ポインタは、文字チェーンの最初の文字を指します。

cout << *aString; // H

しかし、なぜ文字列全体がポインタに保存されるのですか?

cout << aString //Hello Stackoverflow

アドレスを期待しますが、アドレスはポインタに保存されていませんか?「HelloStackoverflow」のアドレスはどこにありますか?

どんな助けでも大歓迎

4

3 に答える 3

12

operator<<(ostream&, char const*)そのポインタで始まるヌル終了文字列を出力するオーバーロードがありostream::operator<<(void*)、アドレスを出力する演算子よりも優先されます。

アドレスが必要な場合は、ポインタをにキャストしますvoid*

于 2012-11-25T13:39:13.157 に答える
8

文字列は、その位置から順番に保存されます。C ++に継承されたCの規則は、文字列としてaを使おうとすると、0バイトchar *に遭遇するまで文字を読み続けると単純に述べています。

アドレスを取得したい場合はcout、それを「文字列」として解釈しないように指示してください。

std::cout << (void *)aString << std::endl;

編集

標準は0=='\0'とどこに述べていますか?

C ++ 11ドラフト、セクション2.3-3から:

基本実行文字セットと基本実行ワイド文字セットには、それぞれ、基本ソース文字セットのすべてのメンバーに加えて、アラート、バックスペース、およびキャリッジリターンを表す制御文字に加えて、ヌル文字(それぞれヌルワイド文字)が含まれます。その表現はすべてゼロビットです。

于 2012-11-25T13:37:35.737 に答える
0

aStringは確かにアドレスを保持しますがoperator<<、コードが選択するオーバーロード(operator<<(ostream&, const char*))は、指定されたアドレスではなく、そのアドレスで始まるnullで終了する文字列を出力します。

ostream::operator<<(void*)アドレスを出力する場合は、にキャストaStringしてオーバーロードを使用できますvoid*

于 2012-11-25T13:43:55.357 に答える