2012-10-04 25 views
-2
int age; 
char name[10]; 

scanf("%d", &age); 
scanf("%s", name); 

在第一scanf功能我們使用'&'符號歲以前,但在第二scanf我們不使用'&' ,因爲它是一個字符數組。有人可以告訴我爲什麼是這樣嗎?爲什麼我們沒有在scanf使用「&」爲焦炭arrray

+1

@AVD:請不要模塊化你最近的一個問題VTC'd。社區投票對此非常好。 – ThiefMaster

回答

2

在大多數情況下,輸入「的T N元件陣列」的表達將被轉換爲(「衰變」)輸入「指針T」,並且表達式的值將是數組中第一個元素的地址。

當編寫

scanf("%s", name); 

表達name具有類型 「的char 10元件陣列」;按照上述規則,將其轉換爲類型「指向char」的指針,其值與&name[0]相同。所以scanf收到一個指針值,而不是數組值。

此規則的例外是當陣列表達的sizeof_Alignof一個操作數,或一元&運營商,或者是字面被用來初始化一個聲明另一陣列的字符串。

注意,表達式name&name會給你相同(數組的第一元素的地址是相同的數組的地址),但它們的類型將是不同的; name將具有類型char *,而&name將具有類型char(*)[10]或「指向10元素陣列char」的指針。

5

由於數組已經作爲地址傳遞,而整數變量不是(因此明確需要通過地址運算符&傳遞的地址)。

4

數組名稱本身引用該數組在內存中的開始位置。在這種情況下:

name == &name[0] 
-2

該數組名稱已經是一個指針,它在這種情況下指向的內存位置爲char。如果使用'&'它將是一個指向該數組的指針,並且將是char(*)[10]類型。但有利的論點必須是char *。在這種情況下,name類型爲char *,與int類型的年齡不同。

+0

[John Bode的回答](https://stackoverflow.com/a/12726510/501011)更詳細地解釋了相同的概念,問題提出後5小時 - 而不是5年後。 –

+0

5年前我幾乎只有13歲! –

相關問題