解決済みの質問

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 なんですか?

投稿日時 - 2001-12-11 12:15:48

連想キーワード:

QNo.183301

A__

暇なときに回答ください

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

>02 がどうして 64fe01 なんですか?

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

printf("%#x %#x", *a, *b);

と書けばうまくいくはずです。

投稿日時 - 2001-12-11 12:28:09

お礼

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

投稿日時 - 2001-12-11 21:06:46

ANo.2

1人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(2件中 1~2件目)

ANo.3

文字列を受け付けるのは %s だけです。
なので、文字列を 0x30 0x32 と表示するのでしたら、ループなどにするしかないです。

char *p;
for (p = a; *p; p++) {
printf("%#x ", *p);
}

投稿日時 - 2001-12-11 14:25:08

お礼

0x30 0x32 と表示させることもできました。

#include <iostream.h>
main(){
char a[] = "02";
char *p;
for (p = a; *p; p++) {
printf("%#x ", *p);
}
}

投稿日時 - 2001-12-11 21:16:59

ANo.1

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

投稿日時 - 2001-12-11 12:25:30

お礼

ありがとうございます。
表示されていたのはアドレスだったと分かりました。

#include <iostream.h>
main(){
char a[] = "02";
char b[] = "20";
cout << &a << '\n';
cout << &b << '\n';
printf("%#x %#x", a, b);
}

投稿日時 - 2001-12-11 21:03:37

あわせてチェックしたい
  • \"%s\"の使いかたについて ...
  • insert into $DB (data1, data2) values (\"$data1\", \"$data2\")で変数扱いされません ...
  • char[]とchar* ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら