27

%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"
4

5 回答 5

37

您可以在此页面上找到格式转义列表。

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

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

于 2009-07-21T02:01:02.250 回答
15

%u打印无符号整数

%d打印有符号整数

获取指针地址使用%p

其他格式转义列表:

以下是格式转义的完整列表。我只是给出这个页面的屏幕截图

在此处输入图像描述

于 2016-05-16T06:55:13.143 回答
7

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

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

    return 0;
}

将输出如下内容:

-1083791044, 3211176252, 0xbf66a93c
于 2009-07-21T02:04:06.990 回答
1

%u 用于无符号整数。由于有符号整数地址运算符 %d 给出的内存地址为 -12,因此要以无符号整数形式获取此值,编译器会返回此地址的无符号整数值。

于 2013-07-10T10:18:24.960 回答
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"
                               ^

如果将指针作为 a 传递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 */
}
于 2017-03-09T16:39:14.927 回答