2015-10-06 36 views
-4

空指針所以,想象我有這個瞭解用C

main() { 
    int a = 5; 
    int *p; 
    printf("p: %d", (void*)p); 
} 

爲什麼我會投的* P在printf語句?但是,如果我這樣做...

p = &a; 
printf("p: %d", *p); 

這次我不必施放?

所以我的問題是,我是否需要每次都將void拋出到空指針?

+0

我生鏽的C,但我要採取一個刺,並說,因爲你隱式地初始化指針與'p =&p;'語句? –

+0

我的意思是說p =&a; –

+1

要打印一個指針的地址,你應該使用'%p'而不是'%d','%p'格式需要轉換'(void *)' –

回答

0

要打印指針值(NULL或其他方式),則必須使用%p轉換說明,它預計其相應的參數有void *類型:

printf("p = %p\n", (void *) p); 

這可能是唯一的一次C你需要明確將一個指針值轉換爲void *(如果它已經不是void *,反正)。之所以要組合printf如何讀取其參數,可變參數函數中的默認類型促銷以及其他一些我尚未弄清楚如何解釋的事情。

請注意,您正在投射值p(指針),而不是指向的值。

在第二個print語句,

printf("*p = %d\n", *p); 

要打印的東西p的價值,這是一個整數。 表達式*p具有類型int,這是%d轉換說明符所期望的。

2

在第一個示例中,您正在打印指針本身的值,但使用了錯誤的格式說明符。

printf("p: %d", (void*)p); 

應該是

printf("p: %p", (void*)p); 

原因是,通過%d指定一個int可能不是大小作爲指針相同。演員的原因,是因爲%p打印了一個void*指針的值。但是請注意:在你的例子中,int *p沒有任何意義,所以打印它的值是沒用的。

在第二個示例中,您正在按指針打印指向的值,並且不需要轉換,因爲類型是一致的。

printf("p: %d", *p); 
+0

想要什麼是存儲在內存..不是內存地址。我試圖解引用它...你是說我無法解引用空指針嗎? –

+1

@YusufJama是的。一個'void *'指針指向一個不確定的對象,所以你不能解引用它。像malloc()這樣的函數返回一個void *指針,以便它可以分配給任何數據類型。但相反,使用'%p'格式的'printf'需要定義一個'void *'指針。 –

+0

如果指針設置爲p =&a,該怎麼辦?爲什麼我不需要一個虛擬空間? –