5

16 進数値 ( %x) とアドレス ( %p) を出力する場合、形式が若干異なります。0x16 進数値の場合、出力される値は次の値で始まりません。

int main()
{
     int x = 0x1234;
     printf("Value of x: %x\n", x);
     printf("Address of x: %p\n", (void*)&x);
}

利回り (gcc):

Value of x: 1234
Address of x: 0xffb0fbfc

0x住所の場合、なぜ強制されるのですか?

スタンダードにまとまると思います。

必要に応じて、住所を印刷しないで住所を印刷する正しい方法は何0xですか? 権利が追加された%pだけではありませんか?%x0x

4

4 に答える 4

3

%p は、0x が追加された %x だけではありませんか?

いいえ..%p引数が型 (void *) であると想定し、アドレスを出力します。

一方%x、unsigned int を unsigned 16 進数に変換し、結果を出力します。

そして、何をするか%pは実装で定義されていますが、標準では、引数が必要であると述べているだけで、%pそれvoid*以外の場合の動作は未定義です。

于 2015-02-25T10:18:11.947 に答える
1

MSVC は「0x」プレフィックスを強制しませんが、オプションで次のように削除できます。

#include <stdio.h>
#include <string.h>

int main(void) {
    int x = 123;
    char hexstr[20];
    sprintf(hexstr,"%p", (void*)&x);
    if (strstr(hexstr,"0x") == hexstr)
        printf ("%s\n", hexstr+2);
    else
        printf ("%s\n", hexstr);
    return 0;
}
于 2015-02-25T10:32:06.623 に答える