2012-04-01 13 views
4

これらのcコードをC++コードに変換したいと思います。それは私がprintfの出力を実行すると、そのようなものであるポインタのprintfについて書式cout for pointer

int n = 44; 
//printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

です:

n=44 &n=22ff1c 

しかし、私はCOUT出力を実行したときにそのようなものです:

n=44 &n=22ff0c 

行う理由2つのバージョンがnのアドレスに対して異なる値を出力しますか?

+1

16進数は変数のメモリアドレスです。これは、プログラムを実行するたびに異なる値を持つことができます。 – Topo

+0

私はprintfを実行するたびに、同じ答えを返します(&n = 22ff1c)。同じ方法で、Coutプログラムは同じ結果を返します(&n = 22ff0c) – cadyT

+0

あなたの編集:2Cは44の16進数です –

答えて

11

コンパイラは、割り当てられたスタック変数をプログラムの異なるバージョンの別の場所に配置します。

printfとcoutの両方のバージョンを同じプログラムに入れて、まったく同じポインタで動作させるようにしてください。次に、2つのバージョンが同じように動作することがわかります。

int n = 44; 
printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

氏リスターが正しく指摘するようにprintf関数内のポインタを印刷するとき、あなたは%Pフォーマット文字列を使用する必要があります。

+3

しかし、 '%x'を使ってポインタをprintfするべきではないという発言はありませんか?あなたたちは私を失望させます。 –

+0

@ Mrリスター・フェア・ポイントは、質問の要点に集中していた。 –

0

空白の違いがあるとは限りません。スタック上にnが割り当てられているアドレスは、プログラムの実行ごとに異なります。そうでなければ、それはすべて私には見えます!

1

nがどこにあるのかを制御しません。コンパイラは、無関係に見える他の事柄によっては、物事がどのように配置されるかを変更することがあります。どうでもいい。あなたはnがどこに行くべきかを言う資格はありません。他の何かが既にあなたが置いておきたい場所にあるかもしれません。