2012-07-05 239 views
1

最近一次微軟訪談中提出了以下問題。int p = *(int *)i和int p = *(int *)&i之間的區別

這兩個聲明有什麼區別?

int p=*(int*)i; 
int p=*(int*)&i; 

我認爲在第一個i是一個指針,並在第二個i是一個變量。
還有別的嗎?

+13

任何足夠先進的差異程序會告訴你這是第14列的&符號。 – 2012-07-05 18:13:43

+1

「我」是如何申報的?如果它是一個'int',那麼'&i'已經是'int *'類型了,而第二行的強制轉換是多餘的。 – 2012-07-05 18:15:46

+3

它的種類取決於我的類型。 – Kevin 2012-07-05 18:16:01

回答

9

第一個是將i中的值作爲指針處理,然後檢索值是否在該地址(如果可能)。

第二個地址爲i,將其轉換爲指向int的指針,並檢索該地址處的值。如果iint,則相當於p=i;。如果不是,則將採用從i開始的第一個CHAR_BIT *sizeof(int)位,並且(試圖)將它們視爲int,並將創建的任何值分配給p

編輯:是的,作爲@R。 Martinho Fernandes指出,如果i有一個超載的operator &,它可能會做一些與上述任何事情相當不同的事情(即,而不是i的地址,它將從operator &返回的任何地址開始)。

+2

除非'i'的類型是邪惡的,即,有一個重載的'操作符&'! :P – 2012-07-05 18:18:05

+1

當然,形式上,如果'i'不是'int',則第二個結果是未定義的行爲。如果'i'的對齊要求不如'int',那麼它可能會崩潰,並且如果'i'小於'int',它可能會崩潰,而恰好在映射內存的最後。 – 2012-07-05 18:22:44

0

如果你知道的語言,然後這個問題歸結爲是什麼betweeen

i 

&i 

的差異,答案是,在第一種情況下它是i和第二它的地址爲i,然後你就可以將這些轉換轉換爲這兩者中的任何一個。

相關問題