- ベストアンサー
アドレス表現
printfで、&をつけて%pとする場合 printfで、&をつけないで%pとする場合 結果が違いますが、どんな違いがありますか? int *p ; int i ; printf( " %p \n %p \n" ,p , &p ) ; printf(" %p \n %p \n" ,i , &i ) ;
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> printf( " %p \n %p \n" ,p , &p ) ; これについては、最初の方(p)はポインタ変数の内容が、後の方(&p)はポインタ変数のアドレスが出力されます。 > printf(" %p \n %p \n" ,i , &i ) ; こちらは、最初の方(i)は、書式指定%pと実引数iが整合しないので、未定義の動作を引き起こします。こうなってしまうと以後はでたらめですが、後の方(&i)がまともに動くとすれば、変数iのアドレスが出力されます。 ちなみに、書式指定%pの出力形式は処理系定義であり、16進数であるかどうかも含めて、どんな形式になるかは規格上規定されていません。具体的な形式を知りたい場合は、処理系のマニュアルを見る必要があります。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
printfの%pと言うのは「引数が何だろうが、引数の中身が何だろうが、とにかく、決まった桁数の16進数に変換しろ」と言う意味しかありません。 つまり、以下のprintfは、どれも「それなりの値を16進数で表示」します。 printf("%p\n",NULL); printf("%p\n",TRUE); printf("%p\n",123); printf("%p\n",i + 4); printf("%p\n",-98765); printf("%p\n",'a' + 0x32); printf("%p\n","abc"); printf("%p\n",i); printf("%p\n",&i); printf("%p\n",p); printf("%p\n",&p); このように、引数に何が書かれてても一切考慮されません。何か謎な値が16進数で表示されるだけです。 なので、引数に「p」と書いた時と「&p」と書いた時では、与えた引数が異なるので、違う結果が表示されます。 ぶっちゃけ、printfの「%p」は、16進数を8桁で表示する「%08x」とまったく一緒です。&を付ける付けないの話と%pの話は、実はまったく関連性が無いのです。なぜなら、前述の例は printf("%08x\n",NULL); printf("%08x\n",TRUE); printf("%08x\n",123); printf("%08x\n",i + 4); printf("%08x\n",-98765); printf("%08x\n",'a' + 0x32); printf("%08x\n","abc"); printf("%08x\n",i); printf("%08x\n",&i); printf("%08x\n",p); printf("%08x\n",&p); って書いても一緒なんですから。 &の有無で何が違うか考える時は、printfの%pの事は忘れて下さい。 結局、この質問は「&の付いた&iと、&のないiと、何が違う?」って質問に帰結します。 なので回答は「値が、変数の実体へのポインタになるか、変数の中に格納された値になるかが違う」と言う事になります。
お礼
すばやい回答ありがとうございました。 勉強になります!
お礼
回答ありがとうございます。 丁寧に教えていただきどうもありがとうございました。