2013-04-12 178 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。因此,只會顯示指針的下半部分。然而,由於你的代碼的行爲是未定義的,它可能以其他方式失敗。