更改函数签名
Change the function signature
我是 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;
}
我的问题是:
- 是否需要在每个函数中声明局部变量(例如
int inputValues [128];
)?
- 将输入存储到函数原型中声明的参数中是否正确?例如,我们可以将所有内容都存储到
integerArray[]
而不是创建存储数组 integerValue
吗?
这看起来很明显,但我想了解这一点以避免将来犯错误。
如果要将数组传递给函数,则需要输入值。
int inputValues [128];
int numberOfValues = readArray(inputValues, 128); //passing array to function
无论哪种方式都可以。所以你所拥有的并没有错。
如评论中所述,您还可以通过引用传递 inputValues。你可以像这样声明函数的原型。
int readArray(int (&integerArray)[128]);
您对通过引用传递的数组所做的任何更改都将在函数 returns 到 main 时更新,因为您不再对数组的副本进行操作。
编辑:
正如@Kevin 指出的那样,您可以使用模板函数在编译时获取数组的大小。
template<size_t N> int readArray(int (&integerArray)[N]);
这不是必需的,您可以改用全局变量,但在安全性和可见性等方面这是一个糟糕的选择。这个程序可以通过几种不同的方式完成,但我想您首先需要了解的是本地和本地之间的区别全球范围,pointer/array。
在程序中,内存分配给
int inputValues[128]; //memory allocation
然后将那个位置的地址传递到这里。
int numberOfValues = readArray(inputValues, 128);
这样效率更高。但是一旦你对指针和数组有了更多的经验,它就会开始变得更有意义。
这道题的理解差距很大
- 函数parameter lists将转换他们的输入:
If the type is "array of T
" or "array of unknown bound of T
", it is replaced by the type "pointer to T
"
- 使用隐式 array to pointer 赋值:
Constructs a pointer to the first element of an array.
这两个一起希望帮助你看到当你声明一个函数时:int readArray(int integerArray[], int maxNumElements)
,integerArray
实际上只是指向它第一个参数的第一个元素的指针。你调用 readArray(inputValues, 128)
所以参数 integerArray
等价于 &intputArray[0]
.
我是 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;
}
我的问题是:
- 是否需要在每个函数中声明局部变量(例如
int inputValues [128];
)? - 将输入存储到函数原型中声明的参数中是否正确?例如,我们可以将所有内容都存储到
integerArray[]
而不是创建存储数组integerValue
吗?
这看起来很明显,但我想了解这一点以避免将来犯错误。
如果要将数组传递给函数,则需要输入值。
int inputValues [128]; int numberOfValues = readArray(inputValues, 128); //passing array to function
无论哪种方式都可以。所以你所拥有的并没有错。
如评论中所述,您还可以通过引用传递 inputValues。你可以像这样声明函数的原型。
int readArray(int (&integerArray)[128]);
您对通过引用传递的数组所做的任何更改都将在函数 returns 到 main 时更新,因为您不再对数组的副本进行操作。
编辑:
正如@Kevin 指出的那样,您可以使用模板函数在编译时获取数组的大小。
template<size_t N> int readArray(int (&integerArray)[N]);
这不是必需的,您可以改用全局变量,但在安全性和可见性等方面这是一个糟糕的选择。这个程序可以通过几种不同的方式完成,但我想您首先需要了解的是本地和本地之间的区别全球范围,pointer/array。
在程序中,内存分配给
int inputValues[128]; //memory allocation
然后将那个位置的地址传递到这里。
int numberOfValues = readArray(inputValues, 128);
这样效率更高。但是一旦你对指针和数组有了更多的经验,它就会开始变得更有意义。
这道题的理解差距很大
- 函数parameter lists将转换他们的输入:
If the type is "array of
T
" or "array of unknown bound ofT
", it is replaced by the type "pointer toT
"
- 使用隐式 array to pointer 赋值:
Constructs a pointer to the first element of an array.
这两个一起希望帮助你看到当你声明一个函数时:int readArray(int integerArray[], int maxNumElements)
,integerArray
实际上只是指向它第一个参数的第一个元素的指针。你调用 readArray(inputValues, 128)
所以参数 integerArray
等价于 &intputArray[0]
.