プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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
    • good
    • 0
この回答へのお礼

「pはaのアドレス。
 &pはpのアドレス。」
上の回答がまさに希望のものでした。
グダグダな質問に二度も回答して下さったことに感謝します。

「&a」と「&p」が同じ値を返しているという勘違いをした上での質問だと気付きました。
こんな質問をして皆さんすみませんでした。

お礼日時:2010/09/30 00:09

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

初心者にとって有難い解説をどうもありがとうございます。

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

お礼日時:2010/09/30 00:38

void main(){


int* p;
int n = 100;
p = &n;

cout << p << endl;
cout << *p << endl;

}

結果:
0012FF54
100

私のコンパイラもVSですが、ちゃんとアドレスで表示されましたよ。

この回答への補足

今改めて実行してみると自分の環境でもアドレスが表示されました...。

この場合&pでもアドレスが表示されると思うのですが、
「&p」と「p」の違いは何でしょうか?

補足日時:2010/09/28 17:33
    • good
    • 0

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

この回答への補足

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

補足日時:2010/09/28 17:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!