ここから本文です

C言語、プラグラミングでアドレスを表示するとき、変換指定子の「%p」と「%x」の違...

sta********さん

2007/11/2015:40:49

C言語、プラグラミングでアドレスを表示するとき、変換指定子の「%p」と「%x」の違いはなんですか?

例えばこんなプログラムがあったとします。
#include <stdio.h>
int main(void)
{
int num[3] = {1,2,3};
printf("[0]=%x,[1]=%x,[2]=%x\n",&num[0],&num[1],&num[2]);
printf("[0]=%p,[1]=%p,[2]=%p\n",&num[0],&num[1],&num[2]);
return(0);
}
実行結果は、
[0]=bfd4db90,[1]=bfd4db94,[2]=bfd4db98
[0]=0xbfd4db90,[1]=0xbfd4db94,[2]=0xbfd4db98

ただ変わっているといえば「%p」だと「0x」がついただけ。
ふと思っただけなのですが、お答えお願いします。

閲覧数:
38,303
回答数:
3

違反報告

ベストアンサーに選ばれた回答

dis********さん

2007/11/2018:18:08

内部での定義がちょっと違います.
%xはunsigned型の実引数を,16進数形式で表してくれます.
%pはポインタの値を16進数形式で表してくれます.
多くのコンパイラはどちらでも同じような処理をするようですが,
%pはポインタを表示するための変換指定子であるのに対し,
%xは符号なし整数型を16進数表示するための変換指定子である点が異なります.
(ちなみに,gccでは%pの場合行頭に0xを,%xの場合には特に何も付けずに表示してくれるようです.)

質問した人からのコメント

2007/11/21 20:26:26

ありがとうございます…
ポインタの場合は%p、普通の場合は%xで良いのでしょうか…?
まだ入門者なので、自分には難しいですが…
少しずつ理解しておきます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

mag********さん

編集あり2007/11/2021:35:17

例えば、オブジェクトのポインタのサイズが int のサイズより大きい処理系(64ビットマシンなどの処理系では多いでしょう)なら、 printf("[0]=%x,[1]=%x,[2]=%x\n",&num[0],&num[1],&num[2]) はまともな表示はされないと思いますよ。

追加:
一方、sizeof(void *) >= sizeof(int) なら、printf() は可変引数部分は、int へ格上げされるので、実質的な違いはないでしょうね。
printf("[0]=%x,[1]=%x,[2]=%x\n",(int)&num[0],(int)&num[1],(int)&num[2]) あるいは、printf("[0]=%x,[1]=%x,[2]=%x\n",(unsigned)&num[0],(unsigned)&num[1],(unsigned)&num[2]) と同じ。

kub********さん

2007/11/2016:59:03

%x はアドレスを16進整数とみなして表示しています。
(%#x とすれば先頭に0xが付加されます。)
%p はアドレスを16進数で表示します。

当方で、実行したところ、
出力は
[0]=12fed8,[1]=12fedc,[2]=12fee0
[0]=0012FED8,[1]=0012FEDC,[2]=0012FEE0
でした。

%pの出力に0xが付くかどうかはコンパイラの仕様によるのかも知れません。
MS-C/C++のマニュアルでは%pの出力の先頭に、0xが付くとは記述していません。
当方の環境:Win XP、 VC++ 2003。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる