这是我的计划.输出如下.
#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)