プロが教える店舗&オフィスのセキュリティ対策術

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

結果 → 0x64fe01 0x64fdfe

もし結果が 0x30,0x32 0x32,0x30
という感じなら分かるのに
02 がどうして 64fe01 なんですか?

A 回答 (3件)

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



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

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

と書けばうまくいくはずです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/11 21:06

文字列を受け付けるのは %s だけです。


なので、文字列を 0x30 0x32 と表示するのでしたら、ループなどにするしかないです。

char *p;
for (p = a; *p; p++) {
printf("%#x ", *p);
}
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/12/11 21:16

「char a[]」は、「char *a」と同じくポインタ変数の定義です。


実際に領域を確保するわけではありません。
従いまして、char a[] = "02"; では、先頭の"0"のアドレスがaに代入されます。この結果は、ポインタ型変数a,bのアドレスを表示したにすぎません。
    • good
    • 0
この回答へのお礼

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

#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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!