• ベストアンサー

printf("%x", str)

#include <iostream.h> main(){ char a[] = "02"; char b[] = "20"; printf("%#x %#x", a, b); } 結果 → 0x64fe01 0x64fdfe もし結果が 0x30,0x32 0x32,0x30 という感じなら分かるのに 02 がどうして 64fe01 なんですか?

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

  • ベストアンサー
  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.2

>02 がどうして 64fe01 なんですか? 恐らく、変数a,bのアドレスが表示されていると思います。 %xは与えられた変数の値を16進表示するのでaと書いてprintf渡すと、変数aは配列ですので、aと書けばそのポインタの値(=メモリアドレス)がprintfに渡されることになります。 中身を表示したいのであれば、 printf("%#x %#x", *a, *b); と書けばうまくいくはずです。

A__
質問者

お礼

cout では a で 02 が表示されるのに、 printf( ) の場合は a だとアドレスになるから printf( ) の場合は *a にしないと値が得られないんですね。

その他の回答 (2)

noname#30727
noname#30727
回答No.3

文字列を受け付けるのは %s だけです。 なので、文字列を 0x30 0x32 と表示するのでしたら、ループなどにするしかないです。 char *p; for (p = a; *p; p++) { printf("%#x ", *p); }

A__
質問者

お礼

0x30 0x32 と表示させることもできました。 #include <iostream.h> main(){ char a[] = "02"; char *p; for (p = a; *p; p++) { printf("%#x ", *p); } }

回答No.1

「char a[]」は、「char *a」と同じくポインタ変数の定義です。 実際に領域を確保するわけではありません。 従いまして、char a[] = "02"; では、先頭の"0"のアドレスがaに代入されます。この結果は、ポインタ型変数a,bのアドレスを表示したにすぎません。

A__
質問者

お礼

ありがとうございます。 表示されていたのはアドレスだったと分かりました。 #include <iostream.h> main(){ char a[] = "02"; char b[] = "20"; cout << &a << '\n'; cout << &b << '\n'; printf("%#x %#x", a, b); }