2013-01-14 34 views
0

我對C指針的解引用存在一些疑問。考慮下面的代碼:在前面解除引用(void *)

void *vptr; // declare as a void pointer type 
int val = 1; 
int *iptr; 

// void type can hold any pointer type or reference 
iptr = &val; 
vptr = iptr; 
printf("iptr=%p, vptr=%p\n", (void *)iptr, (void *)vptr); 

當我們做(void *)iptr,什麼是我們實際打印?我認爲,當解引用時,它應該打印數字1,但它實際上打印一個地址。這是爲什麼?爲什麼有必要在前面添加(void *)以打印地址? iptr會不夠?

感謝

回答

2

當我們這樣做(無效*)IPTR,什麼是我們實際打印?

您正在以實現定義的方式打印iptr指針的值。

我想提領時,應打印數量1,但實際打印地址

你是不是提領與(void *)運行任何東西,你是鑄造void *。要打印由iptr指向的對象的值,您需要使用d轉換說明符和參數*iptr(這裏您是取消引用iptr指針)。

爲什麼需要在前面添加(void *)以打印地址?

因爲p轉換說明符需要類型爲void *的參數。

不會iptr夠了嗎?

iptrint *p轉換說明需要void *,所以不投它會調用未定義的行爲。

+0

感謝您的回答。我仍然懷疑我們什麼時候用(void *)來投射哪個值? –

+0

@HommerSmith我寫過它,它以實現定義的方式打印指針的值,因爲C標準爲'p'specifier指定了這種方式。這讓編譯器選擇以「(nil)」或「0x0」打印空指針。通常它會打印一個十六進制的內存地址。請注意,除了類型不同之外,'(void *)iptr'的值與'iptr'的值相同。 – ouah

1

當你寫(void*)iptr,你投的指針爲int指向void。解引用指針被寫爲*iptr。這將取值爲iptr分。

當您使用格式%p打印iptr時,會打印iptr指向的地址。它與&val相同。如果你要打印的價值iptr點,使用的格式%d

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

這將顯示

* IPTR = 1

1

取消引用在C/C的指針++使用*標誌。你實際上在做的是將iptr作爲一個空指針。因此你會看到打印的地址。

試試這個: printf("iptr=%p, vptr=%p\n", *iptr, (void *)vptr); :)

+0

'* vptr'做什麼? –

+0

我在匆忙中寫道。以這種方式解引用void指針將導致編譯時錯誤。我編輯我的帖子來糾正這一點。 –

相關問題