当我尝试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
答案 0 :(得分:3)
在
printf("%p","%d","%u",ptr,ptr,ptr)
格式字符串仅为"%p"
。它输出一个指针,该指针是"%d"
(字符串文字)的地址。其余参数("%u", ptr, ptr, ptr
在格式字符串中没有相应的指令,因此将忽略它们。
该呼叫实际上等效于
printf("%p", "...");
请注意,%p
占void *
,而%d
占int
,而%u
占unsigned 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);