printf格式(%d与%u)

时间:2009-07-21 01:57:26

标签: c pointers formatting printf

打印指针地址时%d%u之间有什么区别?

例如:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"

5 个答案:

答案 0 :(得分:26)

您可以在this page上找到格式转义列表。

%d是有符号整数,而%u是无符号整数。指针(当被视为数字时)通常是非负数。

如果您确实想要显示指针,请使用%p格式说明符。

答案 1 :(得分:6)

如果我正确理解您的问题,您需要%p来显示指针正在使用的地址,例如:

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

将输出如下内容:

-1083791044, 3211176252, 0xbf66a93c

答案 2 :(得分:4)

%u 打印无符号整数

%d 打印有符号整数

获取指针地址使用%p

其他格式转义列表:

以下是格式转义的完整列表。我只是给出this page

的屏幕截图

enter image description here

答案 3 :(得分:1)

%u用于无符号整数。由于有符号整数地址运算符%d给出的存储器地址是-12,要使用无符号整数获取该值,Compiler将返回该地址的无符号整数值。

答案 4 :(得分:1)

区别很简单:它们会在编译时发出不同的警告消息:

1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %d\n", &a); // prints "memory add=-12"
                               ^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %u\n", &a); // prints "memory add=65456"
                               ^

如果您将指针作为void*传递并使用%p作为转换说明符,则不会收到任何错误消息:

#include <stdio.h>

int main()
{
    int a = 5;
    // check the memory address
    printf("memory address = %d\n", &a); /* wrong */
    printf("memory address = %u\n", &a); /* wrong */
    printf("memory address = %p\n", (void*)&a); /* right */
}