%p 到底是什么?为什么它与使用 %d 打印指针的 int 值不同?

What exactly is %p and why is it different from printing the int value of pointer by using %d?

#include <stdio.h>

int main()
{
    int *ptr;
    int a=2;
    ptr=&a;
    printf("%p\n",ptr);
    printf("%d\n",ptr);
    printf("%p\n",a);
    return 0;
}

我得到的输出是:

% ./a.out
0x7ffe12032c40
302197824
0x2
%

前两个输出的值发生变化(显然是因为 ASLR)而 0x2 保持不变。

用于打印指针。同样,您不使用 %d 打印浮点数,也不应使用 %d.

打印指针

0x2 只是整数 2 的十六进制表示。 这就是为什么你看到输出

printf() 以十六进制格式打印变量 a 的值。如果要打印a的地址,执行以下操作

printf("%p",&a);

指针的大小不等于int的大小,所以你不能用%d代替%p,%p用于打印存储在指针变量中的值,同样使用%p和int变量是未定义的行为(如果您在指针和 int 具有相同大小的系统上,您可能会看到正确的结果,但作为 C 标准,它是未定义的行为)

sizeof int 由编译器定义,不同的编译器在单台机器上可能有不同的 int 大小,但指针大小由机器类型定义(8,16,32,64 位)

当您使用 %p

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

%p是指针的格式说明符,你得到了预期的结果

当您使用 %d

printf("%d\n",ptr);

%d 是有符号整数的格式说明符,您会得到意想不到的结果,因为 pointers 的大小(通常为 8 个字节)可能与 signed integers 的大小不同(通常是 4 个字节)。