下面的代碼片段證據,可以證明兩者是相同的:數組地址和數組本身有什麼區別嗎?
int a[4];
printf("a: %p\n&a: %p", a, &a);
"0x12345678"
"0x12345678"
但是,編譯器會在以下情況下發出警告:從兼容的指針類型
int a[4], *p;
p = &a;
分配哪指針類型確實有
&a
?
下面的代碼片段證據,可以證明兩者是相同的:數組地址和數組本身有什麼區別嗎?
int a[4];
printf("a: %p\n&a: %p", a, &a);
"0x12345678"
"0x12345678"
但是,編譯器會在以下情況下發出警告:從兼容的指針類型
int a[4], *p;
p = &a;
分配哪指針類型確實有
&a
?
是正確的,首先,你的打印語句應該看起來像
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,在你的情況下,p
是int *
類型。
這就是爲什麼編譯器會警告你關於賦值中類型不匹配的原因。
@haccks先生,在這個特定的問題,將參數投給'void *'是必需的部分。我想請你重新考慮將此標記爲僞裝。謝謝。 :-) –
@SouravGhosh;再次檢查:) – haccks
@haccks感謝您的編輯,但是這也不會使我以前的評論無效。 :-) –