- ベストアンサー
std::cout << p と std::cout << *p の違
std::cout << p と std::cout << *p の違いは? VC++でコードを書きながらC++を学んでいます。 ポインタで疑問に思ったことがあるので質問させて下さい。 int* p; int n = 100; p = &a; 上記のように変数を宣言・代入した場合、 std::cout << p と std::cout << *p のどちらでも"100"と表示されます。 これら二つの違いは何でしょうか? 本来*pとすべきところをpにしてもVC++が気を利かせて &pのアドレスに入っているデータを表示してくれているということでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1氏の回答にあるコードを元に答えます。 >この場合&pでもアドレスが表示されると思うのですが、 >「&p」と「p」の違いは何でしょうか? pはaのアドレス。 &pはpのアドレス。 (「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい) 「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。 p = &a; //OK &a = p; //error int* const p2 = p; p2 = &a; //error
その他の回答 (3)
- layryu3
- ベストアンサー率0% (0/1)
「p」「*p」「&p」の違いでしたら p の値 &n p の値のアドレスが持つ内容 n *p *pの値 *p *p の値が持つ値 &n *"pの値が持つ値"が持つ内容 n &p &pの値 &p &pのアドレスが指す値 &n &pのアドレスが指す値が指す内容 n 日本語が下手で分かりにくくなってますが。 *pはポインタのポインタなので *pと&pはほとんど同じです。 ポインタ型での宣言なので *p、**p、&*pの違いってことになりますね。 >> pというポインタにアドレスを代入した後の「p」と「&p」と「*p」の違いです。 ポインタにアドレスを代入する前でも後でも、持ってる役割は一緒です。
お礼
初心者にとって有難い解説をどうもありがとうございます。 「*pはポインタのポインタなので *pと&pはほとんど同じです。 ポインタ型での宣言なので *p、**p、&*pの違いってことになりますね。」 30分くらい考えましたがこのへんがよく分からないので、まだまだ自分は勉強不足みたいです。 せっかく頂いた解説なので折に触れて再チャレンジしてみます。 ありがとうございました。
- sankaku197
- ベストアンサー率47% (29/61)
void main(){ int* p; int n = 100; p = &n; cout << p << endl; cout << *p << endl; } 結果: 0012FF54 100 私のコンパイラもVSですが、ちゃんとアドレスで表示されましたよ。
補足
今改めて実行してみると自分の環境でもアドレスが表示されました...。 この場合&pでもアドレスが表示されると思うのですが、 「&p」と「p」の違いは何でしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず, 「きちんとコンパイルできる」ようなプログラムを出してください.
補足
#include "stdafx.h" #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { int* p; int a = 100; p = &a; std::cout << p; while(1); return 0; } 全文だと上のようにしたですが、今実行してみるとコンソールにアドレスが表示されました。 この質問で何が知りたかったというと、pというポインタにアドレスを代入した後の 「p」と「&p」と「*p」の違いです。
お礼
「pはaのアドレス。 &pはpのアドレス。」 上の回答がまさに希望のものでした。 グダグダな質問に二度も回答して下さったことに感謝します。 「&a」と「&p」が同じ値を返しているという勘違いをした上での質問だと気付きました。 こんな質問をして皆さんすみませんでした。