2013-04-12 177 views
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是一个指针指向第我有意不使用双指针(** q),只是为了检查会发生什么。编译器给了我一个警告,指示不兼容的指针类型。当我执行代码时,我明白q是一个指向p的指针,所以它包含了p的地址,但是* q没有给出p中包含的值,也就是y的地址,而是我得到了一些垃圾值。是否因为我没有将q声明为双指针?任何人都可以解释为什么我得到一些奇怪的* q值?

+0

q是**不是**指向p的指针 –

+0

您打破了q的规则,因此发出了警告,但我承认我不确定此示例中应该打印什么。可能是违反标准问题或导致未定义行为的事情?我会让其他人对这个进行破解。 –

+0

@EugenRieck然后'q'指向哪里? – cdhowie

回答

3

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

从本质上说,是的:既然你宣布q为指针,以int,提领操作*q认为,地址是int。当int作为指针发送到%p时,您遇到未定义的行为。请注意,即使在指针的表示与int完全相同的平台上,行为仍然未定义。这是未定义行为的背叛性质:有时它“错误地”起作用。

+0

p,* q和&y都指向相同的地址; q和&p也指向相同的地址 – 2013-04-12 16:08:04

+1

@ 0A0D就编译器而言并非如此:对编译器来说,'* q'不会指向任何东西,因为它是'int'。 – dasblinkenlight

1

在你的例子中p是一个指向int的指针,这意味着&p是一个指向int指针的指针。因此,q应该声明为int**

从下面我的意见......你声明q错误......因此,*q是一个整数,而不是一个指针,你传递一个整数到printf()在那里看对于一个内存地址......几乎所有的东西都是未定义的行为。

+1

他得到这个,但想知道为什么打印的值是垃圾。 –

+1

另外'printf()'中的'* q'需要是'** q'。 – Brendan

+0

由于我给出的答案...'q'被错误地声明,因此编译将'* q'作为一个'int'而不是'int *',这意味着一个整数,而不是一个指向整数的指针正在传递给'printf' –

1

这一行是不正确的

int *q = &p; 

& p是一个指针(P)中的哪一个指向一个int(Y)

将其分配给一个指向int的地址(Q )将进行重新解释

* q将把p的地址解释为一个整数。这是不相同的内容y(= 5)

1

任何人都可以解释为什么我正在得到一些奇怪的值*q

有几个问题:

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

在某些平台上(包括我上打字的计算机)的指针是除int更宽。如果我在我的电脑上运行你的代码,我得到:

0x7fff5ef94ad8 0x7fff5ef94ad8 0x7fff5ef94ae4 0x5ef94ae4 5 

这里,64位指针是越来越截断为32位int。因此,只会显示指针的下半部分。然而,由于你的代码的行为是未定义的,它可能以其他方式失败。