为什么格式字符串中%p和%x的格式不同?

时间:2015-02-25 10:10:32

标签: c printf format-string

打印十六进制值(%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 个答案:

答案 0 :(得分:9)

  

P

     

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

reference

答案 1 :(得分:5)

%p的输出格式是特定于实现的。并非每个C实现都在地址与int相同的机器上。来自intptr_t

<stdint.h>

答案 2 :(得分:2)

  

%p不仅是一个%x,右边加了0x?

否.. %p期望参数为type(void *)并打印出地址。

%x将unsigned int转换为无符号十六进制并打印出地址。

%p所做的是实现定义,但标准只是说%p期望void*参数,否则行为是未定义的。

答案 3 :(得分:1)

MSVC不强制&#34; 0x&#34;在我身上添加前缀,但您可以选择将其删除:

#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;
}