printf(“%d”,“%u”,“%p”,ptr,ptr,ptr)和printf(“%d%u%p”,ptr,ptr,ptr)有什么区别?

时间:2019-06-23 05:45:02

标签: c pointers printf

当我尝试printf(“%p”,“%d”,“%u”,ptr,ptr,ptr)时,我会收到00405067,但是当我尝试执行printf(“%p%d%u”,ptr时, ptr,ptr)我分别得到0061FF28 6422312 6422312。我了解后一部分,但不确定前一部分。

int main()
{
    int  a = 1;
    int *ptr;
    ptr = &a;
    printf("%p","%d","%u",ptr,ptr,ptr);
    return 0;
}
Output: 00405067
________________

int main()
{
    int  a = 1;
    int *ptr;
    ptr = &a;
    printf("%p %d %u",ptr,ptr,ptr);
    return 0;
}
Output: 0061FF28 6422312 6422312

1 个答案:

答案 0 :(得分:3)

printf("%p","%d","%u",ptr,ptr,ptr)

格式字符串仅为"%p"。它输出一个指针,该指针是"%d"(字符串文字)的地址。其余参数("%u", ptr, ptr, ptr在格式字符串中没有相应的指令,因此将忽略它​​们。

该呼叫实际上等效于

printf("%p", "...");

请注意,%pvoid *,而%dint,而%uunsigned int。如果要打印指针的值,正确的解决方案是使用%p并将指针强制转换为(void *),如

printf("%p\n", (void *)ptr);

要将指针格式化为整数,我相信唯一100%可移植的解决方案是

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

...
printf("%" PRIuPTR "\n", (uintptr_t)(void *)ptr);