最近一次微軟訪談中提出了以下問題。int p = *(int *)i和int p = *(int *)&i之間的區別
這兩個聲明有什麼區別?
int p=*(int*)i;
int p=*(int*)&i;
我認爲在第一個i
是一個指針,並在第二個i
是一個變量。
還有別的嗎?
最近一次微軟訪談中提出了以下問題。int p = *(int *)i和int p = *(int *)&i之間的區別
這兩個聲明有什麼區別?
int p=*(int*)i;
int p=*(int*)&i;
我認爲在第一個i
是一個指針,並在第二個i
是一個變量。
還有別的嗎?
第一個是將i
中的值作爲指針處理,然後檢索值是否在該地址(如果可能)。
第二個地址爲i
,將其轉換爲指向int的指針,並檢索該地址處的值。如果i
是int
,則相當於p=i;
。如果不是,則將採用從i
開始的第一個CHAR_BIT *sizeof(int)
位,並且(試圖)將它們視爲int
,並將創建的任何值分配給p
。
編輯:是的,作爲@R。 Martinho Fernandes指出,如果i
有一個超載的operator &
,它可能會做一些與上述任何事情相當不同的事情(即,而不是i
的地址,它將從operator &
返回的任何地址開始)。
除非'i'的類型是邪惡的,即,有一個重載的'操作符&'! :P – 2012-07-05 18:18:05
當然,形式上,如果'i'不是'int',則第二個結果是未定義的行爲。如果'i'的對齊要求不如'int',那麼它可能會崩潰,並且如果'i'小於'int',它可能會崩潰,而恰好在映射內存的最後。 – 2012-07-05 18:22:44
如果你知道的語言,然後這個問題歸結爲是什麼betweeen
i
和
&i
的差異,答案是,在第一種情況下它是i
和第二它的地址爲i
,然後你就可以將這些轉換轉換爲這兩者中的任何一個。
任何足夠先進的差異程序會告訴你這是第14列的&符號。 – 2012-07-05 18:13:43
「我」是如何申報的?如果它是一個'int',那麼'&i'已經是'int *'類型了,而第二行的強制轉換是多餘的。 – 2012-07-05 18:15:46
它的種類取決於我的類型。 – Kevin 2012-07-05 18:16:01