2015-01-15 23 views
1

我不知道爲什麼我應該這樣做:爲什麼要在賦值時使用數組內存位置?

int myArray[5]; 

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

取而代之的是:

for(int i = 0; i < 5; i++) 
{ 
    scanf("%d", myArray[i]); 
} 
+0

請寫下你爲什麼贊成票! :) –

回答

5

因爲scanf需要知道內存中的位置,它應該寫入它讀取的輸入。要獲取內存位置,需要使用指針,並且myArray[i]不是指針,而是一個值。

要獲得指針,可以使用與號(也稱爲地址的運算符)。你也可以依賴這樣一個事實,即數組自然衰減到指向它們第一個元素的指針,並使用指針算術,方法是隻使用myArray並向數組中的條目添加一個偏移量。這工作,因爲myArray[i]相當於*(myArray + i),同樣&myArray[i]相當於&*(myArray + i)(但由於運營商&和引用操作*的地址,否定對方,這是一樣的(myArray + i),這是一樣的myArray + i)。


至於其他類型的變量,如果變量已經是一個指針,那麼你就不必使用地址運算符(因爲如果你這樣做,你會得到一個指針指針)例如,在讀取字符串時,您只需要傳遞實際變量。對於非指針變量,您需要使用address-of運算符。

+0

然後,我必須用正常的int變量做同樣的事情嗎? –

+0

@ErikW是的。 –

4

因爲[]是數組下標操作,以及myArray[i]類型是intint *這就是scanf期望當您使用"%d"說明符時,您可以使用指針算術執行此操作

for(int i = 0; i <= 5; i++) 
{ 
    scanf("%d", myArray + i); 
} 

因爲myArray將以這種方式處理時會像指針一樣工作。但myArray[i]int所以你需要通過該地址int

相關問題