int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
在第一scanf
功能我們使用'&'
符號歲以前,但在第二scanf
我們不使用'&'
,因爲它是一個字符數組。有人可以告訴我爲什麼是這樣嗎?爲什麼我們沒有在scanf使用「&」爲焦炭arrray
int age;
char name[10];
scanf("%d", &age);
scanf("%s", name);
在第一scanf
功能我們使用'&'
符號歲以前,但在第二scanf
我們不使用'&'
,因爲它是一個字符數組。有人可以告訴我爲什麼是這樣嗎?爲什麼我們沒有在scanf使用「&」爲焦炭arrray
在大多數情況下,輸入「的T
N元件陣列」的表達將被轉換爲(「衰變」)輸入「指針T
」,並且表達式的值將是數組中第一個元素的地址。
當編寫
scanf("%s", name);
表達name
具有類型 「的char
10元件陣列」;按照上述規則,將其轉換爲類型「指向char
」的指針,其值與&name[0]
相同。所以scanf
收到一個指針值,而不是數組值。
此規則的例外是當陣列表達的sizeof
,_Alignof
一個操作數,或一元&
運營商,或者是字面被用來初始化一個聲明另一陣列的字符串。
注意,表達式name
和&name
會給你相同值(數組的第一元素的地址是相同的數組的地址),但它們的類型將是不同的; name
將具有類型char *
,而&name
將具有類型char(*)[10]
或「指向10元素陣列char
」的指針。
由於數組已經作爲地址傳遞,而整數變量不是(因此明確需要通過地址運算符&
傳遞的地址)。
數組名稱本身引用該數組在內存中的開始位置。在這種情況下:
name == &name[0]
該數組名稱已經是一個指針,它在這種情況下指向的內存位置爲char
。如果使用'&'
它將是一個指向該數組的指針,並且將是char(*)[10]
類型。但有利的論點必須是char *
。在這種情況下,name
類型爲char *
,與int
類型的年齡不同。
[John Bode的回答](https://stackoverflow.com/a/12726510/501011)更詳細地解釋了相同的概念,問題提出後5小時 - 而不是5年後。 –
5年前我幾乎只有13歲! –
@AVD:請不要模塊化你最近的一個問題VTC'd。社區投票對此非常好。 – ThiefMaster