2015-07-02 81 views
1

下面的代碼片段證據,可以證明兩者是相同的:數組地址和數組本身有什麼區別嗎?

int a[4]; 
printf("a: %p\n&a: %p", a, &a); 
"0x12345678" 
"0x12345678" 

但是,編譯器會在以下情況下發出警告:從兼容的指針類型

int a[4], *p; 
p = &a; 

分配哪指針類型確實有&a

+1

@haccks先生,在這個特定的問題,將參數投給'void *'是必需的部分。我想請你重新考慮將此標記爲僞裝。謝謝。 :-) –

+0

@SouravGhosh;再次檢查:) – haccks

+0

@haccks感謝您的編輯,但是這也不會使我以前的評論無效。 :-) –

回答

3

是正確的,首先,你的打印語句應該看起來像

printf("a: %p\n&a: %p", (void *)a, (void *)&a); 

因爲%p需要一個void *說法。請注意,printf() being a variadic function, implicit conversion (cast) won't take place,所以,鑄件是必需的。

現在,這一說,a是一個數組,

  • a是類型int [4]
  • &a的是,如果類型int (*)[4]

(但,無論將返回相同地址,FWIW。)您也可以see this answer

OTOH,在你的情況下,pint *類型。

這就是爲什麼編譯器會警告你關於賦值中類型不匹配的原因。

+0

@Quentin遺憾的是,在這種情況下,僞指令不會解決'printf()'中需要的轉換部分。 –

+1

'&a [0]''a'和'&a'全部具有相同的地址,但是具有不同的類型 – Gopi

+0

@Gopi'a'與衰減後的'&a [0]'相同。 – Quentin

相關問題