更改功能签名

时间:2016-05-23 18:09:54

标签: c++ arrays parameters arguments declaration

我是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
  3. 这可能看起来很明显,但我想了解这一点,以避免将来犯错误。

3 个答案:

答案 0 :(得分:2)

  1. 如果要将数组传递给函数,则必须使用inputValues。

    int inputValues [128];
    int numberOfValues = readArray(inputValues, 128); //passing array to function
    
  2. 无论哪种方式,你都可以。所以你所拥有的并没有错。

    如评论中所述,您还可以通过引用传递inputValues。您可以声明这样的函数原型。

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

    当函数返回main时,您对通过引用传递的数组所做的任何更改都将被更新,因为您不再操作该数组的副本。

    编辑:

    正如@Kevin指出的那样,您可以使用模板函数在编译时获取数组的大小。

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

答案 1 :(得分:2)

没有必要,你可以使用全局变量,但这在安全性和可见性等方面是不好的选择。这个程序可以用几种不同的方式完成,但我想你首先需要学习的是本地和全球范围之间的区别,指针/数组。

在程序中,为

分配内存
int inputValues[128]; //memory allocation

然后在这里传递该位置的地址。

int numberOfValues = readArray(inputValues, 128);    

这种方式效率更高。但是一旦你获得了更多的指针和数组经验,它将开始变得更有意义。

答案 2 :(得分:2)

这个问题存在很多理解上的差距。

  1. 函数parameter lists将转换其输入:
  2.   

    如果类型是“T数组”或“T未知范围的数组”,则将其替换为“指向T的指针”

    1. 使用隐式array to pointer作业:
    2.   

      构造一个指向数组第一个元素的指针。

      这两个一起有助于你看到当你声明一个像int readArray(int integerArray[], int maxNumElements)这样的函数时,integerArray实际上只是指向它的第一个参数的第一个元素的指针。您致电readArray(inputValues, 128),因此参数integerArray相当于&intputArray[0]