我正在尝试使用双指针(指向指针的指针)并想要正确理解它.我正在尝试以下代码
#include<stdio.h>
int main()
{
int y = 5;
int *p = &y;
int *q = &p;
printf("\n\n %p %p %p %p %d\n\n",q,&p,p,*q,*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在在上面的代码中,p是指向y的指针,q是指向p的指针.我故意不使用双指针(**q),只是为了检查发生了什么.编译器给了我一个警告,指示不兼容的指针类型.当我执行代码时,我理解q是指向p的指针,所以它包含p的地址,但是*q没有给我p中包含的值,即y的地址,而是我得到了一些垃圾值.是因为我没有将q声明为双指针吗?任何人都可以解释为什么我得到*q的一些奇怪的价值?
我得到了一些垃圾价值。是因为我没有将 q 声明为双指针吗?
本质上是的:由于您声明q为指向 的指针int,因此取消引用操作*q认为该地址是一个int。当它作为指针int发送时,您会遇到未定义的行为。%p请注意,即使在指针的表示形式与 的表示形式完全相同的平台上,该行为也将保持未定义int。这就是未定义行为的危险本质:有时它会“错误地”起作用。