修改函数签名

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
你在主函数中声明数组。在方法中传递并填充它。我没有看到你两次声明数组。 - Andrew Truckle
1
查找通过引用传递数组的方法,然后您就可以填充数组。但是最好先找到这些内容的教程。 - Andrew Truckle
理论上,您可以使inputValues存储129个值,并使用其中一个值来存储“integerValue”,但实际上没有必要这样做。现在的编写方式更易读,更有意义。 - Hill
1
这也是学习调试的好案例。然后你可以观察你的数组,在每个方法调用之前/之后看看它包含了什么等等。 - Andrew Truckle
3个回答

1
这个问题存在很多理解上的差距。
1. 函数参数列表将转换它们的输入:
如果类型是“T数组”或“未知边界的T数组”,则替换为类型“指向T的指针”。
2. 使用隐式的数组到指针赋值:
构造一个指向数组第一个元素的指针。
这两个结合起来有助于您看到,当您声明一个函数如: int readArray(int integerArray[], int maxNumElements) 时,integerArray实际上只是其第一个参数的第一个元素的指针。 您调用readArray(inputValues, 128),因此参数integerArray等同于&intputArray[0]

1
  1. inputValues is necessary if you want to pass an array to the function.

    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
这不是声明一个通过引用传递数组的函数的正确方式。数组也没有length属性。你可以像以前一样通过传递它来获取长度,或者使用模板函数:template<size_t N> int readArray(int (&integerArray)[N]); - Kevin
我的错,我忘记了数组没有长度属性。谢谢你纠正我。 - sebenalern

1
这并非必须,你可以使用全局变量,但从安全性和可见性等方面来看,这是一个不好的选择。这个程序可以用几种不同的方式来完成,但我猜你需要先学习本地作用域、全局作用域、指针和数组之间的区别。
在程序中,分配了内存。
int inputValues[128]; //memory allocation

那个位置的地址在此处传递。
int numberOfValues = readArray(inputValues, 128);    

这样做更加高效。但是一旦您掌握了指针和数组的更多经验,它将变得更加合理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接