打印地址时出现意外的值

Shi*_*rma 3 c pointers

这是我的计划.输出如下.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 3, *pt;
    pt = &n;
    printf("\n%d", pt);
    printf("\n%d", &n);
    printf("\n%d", &pt);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

-9705676
-9705676
-9705672
Run Code Online (Sandbox Code Playgroud)

但我认为第三个数字应该与前两个相同?请有人解释一下为什么不是这样?

P.P*_*.P. 13

这是所有未定义的行为,因为您使用错误的格式说明符来打印指针.

使用%p打印指针扔来void*.

printf("\n%p",(void*) pt);
printf("\n%p",(void*) &n);
printf("\n%p",(void*) &pt);
Run Code Online (Sandbox Code Playgroud)

C标准要求对应于格式规范的参数%p是类型void*.

C11,7.21.6说:

p参数应该是指向void的指针.指针的值以实现定义的方式转换为打印字符序列.

通常,T *(任何对象指针)可以隐式转换为void *没有显式强制转换(例如在赋值中).但是printf()是一个可变函数,并且这里没有发生这样的转换.所以演员阵容是必需的.

但我认为第三个数字应该与前两个相同?

不会.在第三个中,您将打印指针本身的地址.而在前两个,你打印的地址n.

为了说明这一点:

             +------+      
       n --> |      |  
      0x1000 |  3   |  n is stored at address 0x1000
             |      |
             +------+

             +------+      
      pt --> |      |  
      0x2000 |0x1000|  pt stores the address of n. 
             |      |  But the address of pt is different.
             +------+
Run Code Online (Sandbox Code Playgroud)