これをポインタではありません。なぜこうなった?はcout <<のchar *引数を印刷した文字列で、値
答えて
あなたは、このようにコードを変更する必要があります。
cout << static_cast<const void*>(terry);
問題は<<
オペレータは、文字列の内容を印刷するためのCスタイルの文字列へのポインタのためにオーバーロードされていることです。その代わりに生のポインタにキャストすると、iostreamsを使って必要に応じてポインタを出力するというデフォルトの動作が得られます。
"hello"は文字列、つまりchar配列です。 const char*
はこの配列へのポインタなので、このポインタを間接参照すると、最初の要素の値が得られます。
あなたは
int a[] = {1, 2, 3};
int *b = a;
cout << *b << endl;
を持っている場合、あなただけの1
が印刷され得るようにそれはあります。
なぜメモリアドレスを取得していないのですか? –
@ Mr.Puff charポインタのメモリアドレスを取得したい場合は、 'ostream <<'演算子が文字列へのcharポインタのためにオーバーロードされるため、これをvoidポインタの前にキャストする必要があります。 –
std::cout
は、char *
をCスタイルの文字列(の最初の文字)へのポインタとして扱い、そのまま出力します。
cout << (void *) terry;
(またはあなたが鋳造心配している場合const void *
キャストを使用:あなたの代わりにアドレスをしたい場合は、あなただけのがそのように、のようなものを扱わないポインタにキャストすることができますこの特定のケースでは問題にならないもの)を使用することができます。
あなたは現実主義よりも純粋主義者のより多くのなら、あなたもの線に沿って、C++ static_cast
を使用することができます。それは、この特定の場合には不要なのですけれども
cout << static_cast <const void *> (terry);
、へのキャストvoid *
は正常に動作します。
#include <iostream>
int main (void) {
const char *terry = "hello";
std::cout << terry << '\n';
std::cout << (void *) terry << '\n';
std::cout << (const void *) terry << '\n';
std::cout << static_cast<const void *> (terry) << '\n';
return 0;
}
出力(アドレスがご使用の環境で異なる場合があります):static_cast
を使用しているとき、あなたはドンを確実にしなければならない、ということ
hello
0x8048870
0x8048870
0x8048870
注次のサンプルコードは、アクション内のすべてのこれらのオプションを示していstatic_cast <void *>
(それはconst_cast
のためのものです)とのconstnessを投げ捨てようとしません。これは、新しいC++のキャストによって行われるチェックの1つであり、古いスタイルのキャストにはこの制限がありません。
'char *'の値はCスタイルの文字列として扱われません。 Cスタイルの文字列(の最初の文字)の*ポインタ*として扱います。 –
@Keith、意味論上の問題、それについての謝罪。私は、Cスタイルの文字列として出力することを意味していました。私は明確にします。 – paxdiablo
「セマンティクス」という言葉は、それが重要でないということを意味するのでしょうか?そうではありません。 –
coutは、char *を渡すとオーバーロードされるので、Cスタイルの文字列へのポインタとして出力されます。したがって、それはヌル終了文字に当たるまで文字を出力します。
coutの代わりにprintfを使用した場合は、そのアドレスが表示されます。ポインタを別の型、例えば(void *)にキャストし、アドレスも取得できます。std::cout
上
'printf'自体がどのように印刷するかを決めるのではなく、C++で同じ型を使用するのと同じ方法で、正しい書式指定子を使用する必要があります。例えば、 '%s 'を持つ' printf'は 'char *'を持つ' cout'とまったく同じ問題を持ちます。ポインタを取得するには、書式指定子 '%p'を使用します。 – paxdiablo
<<
演算子はオーバーロードされます。その動作は、右オペランドのタイプによって異なります。 (これは、すべてのoperator<<
という名前の、実際にはいくつかの異なる機能です。コンパイラが呼び出すするかを決定します。)
あなたはそれをchar*
またはconst char*
を与えた場合、それは(の最初の文字)へのポインタとしてのオペランドを扱いますC-スタイル文字列、およびその文字列の内容を印刷します
const char * terry = "hello";
cout << terry; // prints "hello"
あなたはそれをchar
値を与えた場合、それは文字としてその値を出力します。
cout << *terry; // prints "h"
cout << terry[0]; // the same
あなたはそれを標準のポインタを与える場合E void*
、それは(典型的には進いくつかの実装で定義されたように、)そのポインタ値を出力:Cスタイルの文字列へのポインタが特殊なケースであり、唯一のよう
cout << static_cast<const void*>(terry); // prints something like 0x4008e4
はchar*
又はconst char*
を治療しますoperator<<
にオペランドの値以外の値を表示させる(私が考えることができる)ものがあります。この理由は、 "string"型を持たず、char*
ポインタを介して文字列を操作するCのC++のルーツに戻ります。
operator<<
には、std::string
などのさまざまな整数型と浮動小数点型のオーバーロードが多数あります。
私が考えることができる別の「特別な」ケースは、(関数がストリームマニピュレータの署名を持たない限り) 'bool'オーバーロードを選択する関数ポインタを出力しようとしていることです:http://ideone.com/OkutRD(確かに'bool'に変換されたポインタの"値 "を出力するので、これは' const char * 'の場合よりも「あまり特別ではない」) –
- 1. C++文字列オブジェクトの表示/印刷方法は? cout << int works、cout << string not
- 2. C++ EOFはcout <<上のCHAR(int型)鋳造
- 3. cout << coutとcout <<とcoutの違いは何ですか?
- 4. 予期せぬcout <<カンマを追加したときの文字列*
- 5. C++。なぜstd :: cout << char + int int値を出力しますか?
- 6. 印刷文字は整数
- 7. 削除<83>と<91>印刷不可能な文字の文字
- 8. C文字列を印刷ジャンク文字
- 9. char *文字列を印刷できません
- 10. C汎用印刷配列関数 - 文字列配列の印刷
- 11. I/Oストリーム文字列操作(正しいCin/cout演算子<</>>)
- 12. 印刷文字列
- 13. 文字列の印刷
- 14. 文字の間に少し遅れた文字列を印刷
- 15. Coutは、文字列が与えられたときに行の先頭に印刷を開始します。
- 16. 文字を文字列で保存して印刷する
- 17. 印刷<<< PHPのHTML?
- 18. 印刷文字列 - C
- 19. "cout"を使用するときに "<<"または "+"を使用して文字列をまとめる
- 20. オーバーロード<<オペレータの印刷住所
- 21. Pythonのループ印刷変数+文字列
- 22. 印刷コマンドライン引数は、セグメンテーションフォールト
- 23. charをスタック用の文字列に変換する<string>
- 24. 変数の値と文字列を一緒に印刷
- 25. 文字列の印刷(アセンブリ)
- 26. 印刷文字列の逆
- 27. モーダルボックスで変数を印刷
- 28. はcharへの配列が<code>char*</code>に文字列を変換する
- 29. 印刷<<< END;質問
- 30. C++のカスタム文字列クラスの<<演算子関数の戻り値
「こんにちは」を取得していませんか? – sth
出力として 'h'が得られますか?それは起こるべきではありません。 'hello'を出力として取得する必要があります。ここに投稿したコードが間違っていて、誤植やコピー&ペーストのエラーではないと確信していますか? –
@sth彼はしています:http://ideone.com/IDudH3 – dotixx