这是我的计划.输出如下.
#include#include int main(void) { int n = 3, *pt; pt = &n; printf("\n%d", pt); printf("\n%d", &n); printf("\n%d", &pt); return 0; }
输出:
-9705676 -9705676 -9705672
但我认为第三个数字应该与前两个相同?请有人解释一下为什么不是这样?
这是所有未定义的行为,因为您使用错误的格式说明符来打印指针.
使用%p
打印指针扔来void*
.
printf("\n%p",(void*) pt); printf("\n%p",(void*) &n); printf("\n%p",(void*) &pt);
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. +------+