• ベストアンサー

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のアドレスに入っているデータを表示してくれているということでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

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

satowave
質問者

お礼

「pはaのアドレス。  &pはpのアドレス。」 上の回答がまさに希望のものでした。 グダグダな質問に二度も回答して下さったことに感謝します。 「&a」と「&p」が同じ値を返しているという勘違いをした上での質問だと気付きました。 こんな質問をして皆さんすみませんでした。

その他の回答 (3)

  • layryu3
  • ベストアンサー率0% (0/1)
回答No.4

「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」の違いです。 ポインタにアドレスを代入する前でも後でも、持ってる役割は一緒です。

satowave
質問者

お礼

初心者にとって有難い解説をどうもありがとうございます。 「*pはポインタのポインタなので  *pと&pはほとんど同じです。  ポインタ型での宣言なので  *p、**p、&*pの違いってことになりますね。」 30分くらい考えましたがこのへんがよく分からないので、まだまだ自分は勉強不足みたいです。 せっかく頂いた解説なので折に触れて再チャレンジしてみます。 ありがとうございました。

回答No.2

void main(){ int* p; int n = 100; p = &n; cout << p << endl; cout << *p << endl; } 結果: 0012FF54 100 私のコンパイラもVSですが、ちゃんとアドレスで表示されましたよ。

satowave
質問者

補足

今改めて実行してみると自分の環境でもアドレスが表示されました...。 この場合&pでもアドレスが表示されると思うのですが、 「&p」と「p」の違いは何でしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

とりあえず, 「きちんとコンパイルできる」ようなプログラムを出してください.

satowave
質問者

補足

#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」の違いです。

関連するQ&A