2

以下の記述について疑問があります。

int intvalue = 3;
int *pointInt = &intvalue;

char* p = "string";
cout << pointInt << std::endl;  // this will give memory location of intvalue which is ok.
cout << p<< std::endl; // why this will give string value  rather than memory location of where string is stored?
4

5 に答える 5

5

のオーバーロードがstd::ostream& operator<<(std::ostream&, const char*)あるため、これはnullで終了char*する文字列の最初の要素であると想定し、文字列全体を出力します。

nullで終了する文字列の最初の要素でchar*ないをストリーミングしようとすると、多くの楽しみがあります。

#include <iostream>
int main()
{
  char c = 'x';
  std::cout << &c << std::endl;
}
于 2013-03-27T10:14:59.173 に答える
3

char*そしてconst char*、Cスタイルのnullで終了する文字列を指すために最も一般的に使用されます。標準のI/Oライブラリは、挿入または抽出するタイプの1つが渡されるときに、これを考慮に入れます。関数は、Cスタイルの文字列を出力することがどれほど一般的であるかに基づいて、この特殊なケースを持つように単純に設計されました。

ポインタ値を取得するには、別のポインタタイプにキャストしてみてください。

std::cout << static_cast<void*>(p) << std::endl;
于 2013-03-27T10:16:17.157 に答える
1

キーワード演算子のオーバーロード-iostreamインスタンスの別のメソッドがstd::cout文字を処理し、それを異なる方法で処理します。正確な実装により、「HelloWorld」も生成される可能性があります

于 2013-03-27T10:15:29.207 に答える
0
cout << (void *) p << std::endl;

文字列を出力するために、演算子には引数<<の特定のオーバーライドがあるためだと思います。char*

于 2013-03-27T10:15:59.320 に答える
0

これはoperator<<()、最初のパラメーターおよびタイプとして、char*またはconst char*2番目としてのcoutオブジェクトのタイプのオーバーロードです。

そのようなオーバーロードはたくさんあり、あなたもいくつか書くことができます。

そして、この特定のオーバーロードの理由は、Cスタイルの文字列(nullで終了するcharの配列)を「出力」するためです。

于 2013-03-27T10:16:25.550 に答える