2010-08-09 20 views
4

爲什麼我們需要將&運算符放在scanf()中用於將值存儲在整數數組中,但不將字符串存儲在char數組中?爲什麼scanf()在某些情況下需要&operator(address-of),而不是其他的?

int a[5]; 
for(i=0;i<5;i++) 
scanf("%d",&a[i]); 

char s[5]; scanf("%s",s); 

我們需要在我們存儲的價值的地方的地址通過,因爲數組是一個指向第一個元素。所以在int/float數組的情況下,它基本上意味着(a+i)

但字符串是什麼情況?

+0

http://c-faq.com/stdio/scanf1a.html – jamesdlin 2010-08-12 19:30:07

回答

4

scanf接受一個指針,指向你將值放入的任何東西。在第一個實例中,你正在傳遞一個對位置i處的特定int的引用。在第二個例子中,您將整個數組傳遞給scanf。在C中,數組指針是同義詞,可以互換使用(有點)。變量s實際上是指向具有5個字符的連續空間的內存的指針。

1

scanf("%d", a + i)也可以。

%d%s只是告訴期待scanf什麼,但在這兩種情況下,預計地址

在C,數組和指針是相關

%s只是說要scanf期待一個字符串,它是\0終止,它是否適合入字符數組或不scanf不關心。

-1

因爲字符數組是已經是指針了。

可以將C數組看作指向堆棧分配數量的RAM的指針。你甚至可以使用指針操作而不是數組索引。 *aa[0]都產生相同的結果(返回數組中的第一個字符)。

+2

'因爲字符數組已經是指針.'它們不是。 – 2013-08-10 23:42:33

2

當您在表達式中使用數組名稱(除了作爲sizeof的操作數或運算符地址&)時,它將評估爲該數組中第一項的地址 - 即指針值。這意味着不需要&來獲得地址。當在表達式中使用int(或short,long,char,float,double等)(同樣,除sizeof&的操作數外),它會評估該對象的值。要獲取地址(即指針值),需要使用&來獲取地址。

相關問題