我正在尝试使用双指针(指针指针)并希望正确理解它。我正在尝试以下代码
#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;
}
现在在上面的代码中,p是指向y的指针,q是指向p的指针。我故意不使用双指针(** q),只是为了检查发生了什么。编译器给了我一个警告,指示不兼容的指针类型。当我执行代码时,我理解q是指向p的指针,所以它包含p的地址,但是* q没有给我p中包含的值,即y的地址,而是我得到了一些垃圾值。是因为我没有将q声明为双指针吗?任何人都可以解释为什么我得到* q的一些奇怪的值?
答案 0 :(得分:3)
我得到了一些垃圾值。是因为我没有将q声明为双指针吗?
实质上,是的:既然您将q
声明为int
的指针,则取消引用操作*q
认为该地址是int
。当int
作为指针发送到%p
时,您会遇到未定义的行为。请注意,即使在指针表示与int
完全相同的平台上,行为仍将保持未定义。这是未定义行为的危险性:有时它“错误地”起作用。
答案 1 :(得分:1)
在您的示例中,p
是指向int的指针,这意味着&p
是指向int的指针。因此,q
应声明为int**
从我在下面的评论中...您已经错误地声明了q
...因此,*q
是一个整数,而不是指针,并且您将整数传递到printf()
它正在寻找一个内存地址......之后的任何事情都是未定义的行为。
答案 2 :(得分:1)
此行不正确
int *q = &p;
&amp; p是指针(p)的地址,指向int(y)
将其指定给指向int(q)的指针将进行重新解释
* q将p的地址解释为整数。这与y(= 5)
的内容不同答案 3 :(得分:1)
任何人都可以解释为什么我会为
*q
获得一些奇怪的价值吗?
有几个问题:
*q
,您尝试将指针解释为int
。这是无效的。printf()
格式说明符与第五个参数的类型不匹配。在某些平台上(包括我输入的计算机),指针更宽而不是int
。如果我在计算机上运行您的代码,我会得到:
0x7fff5ef94ad8 0x7fff5ef94ad8 0x7fff5ef94ae4 0x5ef94ae4 5
这里,64位指针被截断为32位int
。因此,只显示指针的下半部分。但是,由于代码的行为未定义,因此很可能以其他方式失败。