指向指针与指针的指针

时间:2013-04-12 16:03:04

标签: c pointers

我正在尝试使用双指针(指针指针)并希望正确理解它。我正在尝试以下代码

#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的一些奇怪的值?

4 个答案:

答案 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。因此,只显示指针的下半部分。但是,由于代码的行为未定义,因此很可能以其他方式失败。