5

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

#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

4 回答 4

3

我得到了一些垃圾价值。是因为我没有将 q 声明为双指针吗?

本质上,是的:由于您声明q为指向 的指针int,因此取消引用操作*q认为该地址是int. 当它作为指针int发送时,您会遇到未定义的行为。%p请注意,即使在指针表示与int. 这就是未定义行为的危险性质:有时它会“错误地”起作用。

于 2013-04-12T16:06:18.727 回答
1

谁能解释为什么我会得到一些奇怪的价值*q

有几个问题:

  • 首先,通过使用,*q您试图将指针解释为int. 这是无效的。
  • 其次,您的printf()格式说明符与第五个参数的类型不匹配。

在某些平台上(包括我正在输入的计算机),指针int. 如果我在我的电脑上运行你的代码,我会得到:

0x7fff5ef94ad8 0x7fff5ef94ad8 0x7fff5ef94ae4 0x5ef94ae4 5

在这里,64 位指针被截断为 32 位int。因此,仅显示指针的下部。但是,由于您的代码的行为未定义,因此很可能以其他方式失败。

于 2013-04-12T16:10:42.657 回答
1

在您的示例p中是指向 int 的指针,这意味着&p是指向 int 的指针的指针。因此,q应声明为int**

从我下面的评论中...您声明q不正确...因此,*q它是一个整数,而不是指针,并且您将一个整数传递到printf()它正在寻找内存地址的位置...之后几乎所有的事情都是未定义的行为.

于 2013-04-12T16:06:28.080 回答
1

此行不正确

 int *q = &p;

&p 是指向 int (y) 的指针 (p) 的地址

将其分配给指向 int (q) 的指针将进行重新解释

*q 将 p 的地址解释为整数。那和y(=5)的内容不一样

于 2013-04-12T16:06:39.467 回答