2012-12-18 55 views
0

這是我教科書中問題的一部分。我無法弄清楚它究竟做了什麼以及它是如何做到的,所以我一直在尋求幫助。這段代碼片段做了詳細的介紹嗎?

int a = 5, b[] = {1, 2, 3, 4, 5}; 
int *ptr1, *ptr2; 
void *ptr3; 
ptr1 = &a; 
ptr2 = b; 
ptr3 = (int*) &ptr2; 

我不明白這行

ptr3 = (int*) &ptr2;

我最好的猜測是,ptr3被指定爲一個INT指針現在指向同一個地址ptr2點到現在,這是數組b。所以基本上ptr3 = b

這是正確的嗎?有人可以解釋嗎?

+0

什麼課本是? – cnicutar

+0

爲什麼不嘗試gdb(或某些調試器)。 – Rohan

+0

@cnicutar說實話,我不知道哪本教科書。你爲什麼要問? –

回答

4

*&ptr2給出了指針ptr2的地址。儘管ptr2指向與b相同的位置,即該陣列中第一個int的地址,但ptr3將指向存儲b中的地址的ptr2的位置。這意味着它在那個時刻成爲int**

有點像這樣,雖然要小心,PTR2和B具有相同的價值,但在內存中是不同的:

ptr3 -> ptr2 -> 1,2,3,4,5

  `b /^` 

然後代碼繼續投是一個int *爲原因,這些原因並不合理,並且在void *的分配中使用。對我來說看起來相當錯誤。無論你在哪裏找到它,都忘記那個來源。

+0

」這個時候它變成了一個int **。「 - 這不是考慮事情的好方法。請注意'&x'的類型是' *',所以既然'ptr2'的類型是'int *','&ptr2'的類型就是'int **'。這是一個嚴格的靜態(編譯時)概念;沒有「成爲」涉及。 –