5

打印十六进制值 ( %x) 和地址 ( %p) 时,格式略有不同。0x在十六进制值的情况下,打印的值不以开头:

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不是只有一个%x加上一个0x才对?

4

4 回答 4

10

p

参数应该是一个指向 void 的指针。指针的值以实现定义的方式转换为可打印字符序列。

参考

于 2015-02-25T10:13:08.400 回答
5

的输出格式%p是特定于实现的。并非每个 C 实现都在地址与int. 有intptr_t<stdint.h>

于 2015-02-25T10:13:19.647 回答
3

%p 不仅仅是一个 %x 加上一个 0x 对吧?

不..%p期望参数是类型 (void *) 并打印出地址。

%x将无符号整数转换为无符号十六进制并打印出结果。

来做什么%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 回答