2016-05-23 204 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]