2016-05-23 92 views
4

我是C++的新手,現在有一件事情我想說清楚。正如我經歷了教程,有這個程序,存儲用戶的輸入到一個數組,並給出所有數字的總和,當用戶退出程序:更改函數簽名

//PROTOTYPE DECLARATION: 
int readArray(int integerArray[], int maxNumElements); 
int sumArray(int integerArray[], int numElements); 
void displayArray(int integerArray[], int numElements); 

int main(int nNumberofArgs, char* pszArgs[]) 
{ 
    cout << "This program sums values entered\n"; 
    cout << "Terminate the loop by entering a negative number" << endl;  
    //store the numbers from the user into a local array 
    int inputValues [128]; 
    int numberOfValues = readArray(inputValues, 128); 
    //output the values and the sum of the values 
    displayArray(inputValues, numberOfValues); 
    cout << "The sum is " << sumArray(inputValues, numberOfValues) << endl; 
    return 0; 
}  
int readArray(int integerArray[], int maxNumElements) 
{ 
    int numberOfValues; 
    for(numberOfValues = 0; numberOfValues < maxNumElements; numberOfValues++) 
    { 
     //fetch another number 
     int integerValue; 
     cout << "Enter next number: "; 
     cin >> integerValue; 
     if (integerValue < 0) 
     { 
      break; 
     } 
     //otherwise store the number into the storage array 
     integerArray[numberOfValues] = integerValue; 
    } 
    //return the number of elements read 
    return numberOfValues; 
} 
//displayArray - display the members of an array: 
void displayArray(int integerArray[], int numElements) 
{ 
    cout << "The value of the array is:" << endl; 
    for(int i = 0; i < numElements; i++) 
    { 
     cout << i << ":" << integerArray[i] << endl; 
    } 
    cout << endl; 
} 
//sumArray 
int sumArray(int integerArray[], int numElements) 
{ 
    int accumulator = 0; 
    for(int i = 0; i < numElements; i++) 
    { 
     accumulator += integerArray[i]; 
    } 
    return accumulator; 
} 

我的問題是:

  1. 是否需要在每個函數中聲明局部變量(例如int inputValues [128];)?
  2. 將輸入存儲到函數原型中聲明的參數中是否正確?例如,我們是否可以將所有內容都存儲到integerArray[]而不是創建存儲陣列integerValue

這看起來很明顯,但我想明白這一點,以避免將來犯錯。

+1

'integerValue'不是一個數組。你應該在更簡單的練習上工作一段時間。 – Beta

+0

你在main中聲明數組。傳遞並填寫該方法。我沒有看到你聲明一個數組兩次。 –

+1

查找通過引用傳遞數組。然後你可以填充數組。但正如最好先找到這些教程。 –

回答

2
  1. 如果要將數組傳遞給函數,inputValues是必需的。

    int inputValues [128]; 
    int numberOfValues = readArray(inputValues, 128); //passing array to function 
    

無論哪種方式,你這樣做是好的。所以你有沒有錯。

正如評論指出的,你也可以通過引用傳遞inputValues。你可以像這樣聲明函數的原型。當功能,因爲你是不是在陣列的複製操作再返回到主

int readArray(int (&integerArray)[128]); 

你讓你按引用傳遞數組的任何更改將被更新。

編輯:

由於@Kevin指出的那樣,你可以使用模板函數在編譯時得到數組的大小。

template<size_t N> int readArray(int (&integerArray)[N]); 
+1

這不是你如何聲明一個函數採取數組引用。陣列也沒有「長度」屬性。你可以通過像以前一樣傳遞它或通過使用模板函數來獲得長度:'template int readArray(int(&integerArray)[N]);' – Kevin

+0

我忘了該數組沒有length屬性。謝謝你糾正我。 – sebenalern

2

這是沒有必要,你可以使用全局變量,而不是那不過是不錯的選擇而言安全性和可視性等這個程序可以做幾種不同的方式,但我猜你需要先了解什麼是區別本地和全局範圍,指針/數組。

在節目中,內存是分配給

int inputValues[128]; //memory allocation 

那麼該位置的地址,在這裏通過。

int numberOfValues = readArray(inputValues, 128);  

這樣更有效率。但是,一旦你獲得了有關指針和數組的更多經驗,它將開始變得更有意義。

2

有很多在這個問題上認識的差距。

  1. 功能parameter lists將轉換它們的輸入:

如果類型是「的T陣列」或「結合的T未知的數組」,它是由型「指針替換T

  • 使用隱式array to pointer分配:
  • 構造一個指向數組的第一個元素的指針。

    這兩者結合起來希望能幫助你看,當你像聲明一個函數:int readArray(int integerArray[], int maxNumElements)integerArray其實只是一個指向它的第一個元素的第一個參數。您致電readArray(inputValues, 128),以便參數integerArray等於&intputArray[0]