为什么对于指针*p,p[0]是p存储的地址,p[1]是p本身的地址?

dan*_*iel 2 c printf pointers undefined-behavior dereference

代码

int n = 25;  
int *p = &n;  
printf("%x\n %d\n %x\n", p, p[0], p[1]);
Run Code Online (Sandbox Code Playgroud)

返回:

\<adress-of-p  
25  
\<adress-of-p>  
Run Code Online (Sandbox Code Playgroud)

当然我永远不会这样做,但在 K&R 中指出

“如果 pa 是指针,则表达式可以将其与下标一起使用;pa[i] 与 *(pa+i) 相同。

所以我很好奇。

Vla*_*cow 5

这个说法

printf("%x\n %d\n %x\n", p, p[0], p[1]);
Run Code Online (Sandbox Code Playgroud)

由于两个原因调用未定义的行为。

第一个是要输出指针,您应该使用正确的转换说明符。第二个问题是,您不能取消引用这样的p[1]不指向有效对象的指针。

相反,你可以写例如

printf("%p\n %d\n %p\n", ( void * )p, p[0], ( void * )( p + 1 ) );
Run Code Online (Sandbox Code Playgroud)