用%d打印int指针时打印出来的是什么?

Jos*_*lar 3 c pointers

这段代码:

#include <stdio.h>

int main() {
    int num;
    int *pi;
    num = 0;
    pi = &num;
    printf("address: %p | %d\nvalue: %d\n", pi, pi, *pi);
}
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

address: 0x7fff5952f9cc | 1498610124
value: 0
Run Code Online (Sandbox Code Playgroud)

我知道左边的那个应该是正确的地址,但是地址旁边打印的是什么?

Sia*_*Sia 5

%p告诉printf将相应的变量视为指针,从而printf打印p为指针; 也就是说,十六进制表示(即0x7fff5952f9cc).%d另一方面告诉printf将相应的变量视为数字.因此,正在打印的是(即)的实际数值,其在基数10中仅为0x5952f9cc.p1498610124

现在,同一个变量的这两个表示似乎具有不同值的原因是,%d只能告诉printf期望一个数字---它没有指定该数字的类型.如果将0x7fff5952f9cc(64位整数)转换为int(32位类型),则会得到1498610124(通知会0x7fff被删除).