[英]How do I return a array from a function?
我正在学习课堂上的指针,但我从未真正理解数组100%
我有一项任务,我必须从函数中读取一系列学生分数。 数组的每个元素将保持不同的分数,元素标识它是什么学生。
我正在尝试将分数读入数组但是当它返回时我就迷失了。 我试过谷歌,但只是变得更加困惑,因为人们谈论动态内存和使用新的和删除操作数,我还没有得到,我不想做错的任务。
我必须使用指针而不是索引来访问数组中的元素。 下面的代码给出了错误“重新定义形式参数'scoreArray'”
#include <iostream>
using namespace std;
const int maxStudents = 30;
double readScores(double[]);
int main()
{
double scoreArray[maxStudents];
readScores(scoreArray);
cout<<scoreArray[1],scoreArray[2];
system ("PAUSE");
return 0;
}
double readScores(double scoreArray)
{
double scoreArray[maxStudents];
double *scorePTR;
*scorePTR = scoreArray;
for(int count = 0; count < maxStudents; count++)
{
cout<<"Please enter score for student "<<count+1<<" or -999 to end.\n";
cin>>*(scorePTR+count);
if(*(scorePTR+count) == -999)
break;
}
}
double readScores(double scoreArray)
{
double scoreArray[maxStudents];
...
}
发生编译错误是因为您声明了一个名为scoreArray
的局部变量,该变量与形式参数double scoreArray
名称相同。 更改其中一个的名称。
你快到了:
double readScores(double scoreArray[]) {
double *scorePTR;
*scorePTR = scoreArray;
for(int count = 0; count < maxStudents; count++)
{
cout<<"Please enter score for student "<<count+1<<" or -999 to end.\n";
cin>>*(scorePTR+count);
if(*(scorePTR+count) == -999)
break;
}
}
我还建议在访问数组时切换到“直接”数组语法,而不是依赖于数组指针语义,即在表达式中使用scoreArray[count]
而不是*(scoreArray+count)
:
double readScores(double scoreArray[]) {
for(int count = 0; count < maxStudents; count++)
{
cout<<"Please enter score for student "<<count+1<<" or -999 to end.\n";
cin >> scoreArray[count];
if(scoreArray[count] == -999)
break;
}
}
PS:我认为你还没有开始学习STL; 使用标准C ++库存在更合适的解决方案。
您得到的错误是因为您将局部变量命名为与函数的参数相同。
double readScores(double scoreArray /* parameter named scoreArray */)
{
double scoreArray[maxStudents]; // this cannot have the same name!
你展示的代码显示出很多混乱。 我会试着解释它中的错误。
cout<<scoreArray[1],scoreArray[2];
这不会输出元素1和2.为此,它应该是cout << scoreArray[1] << scoreArray[2];
。 另外,请注意C ++中的数组是基于0的,因此第一个元素是scoreArray[0]
,第二个是scoreArray[1]
,第三个是scoreArray[2]
,依此类推。
代码声明了一个名为readScores
的函数, readScores
指针指向double
并返回一个double
:
double readScores(double[]);
但它只定义了一个double
函数:
double readScores(double scoreArray)
我确定这不是预期的,一旦修复了编译器错误,就会产生链接器错误,因为没有double readScores(double[])
函数的定义。
现在,阵列。
当您将参数写为double x[]
,它不是数组。 它是指向double
精度的指针。 它与 double* x
完全相同 。 是的,语法极具误导性。 这就是你不应该使用它的原因。 它播下了混乱。 最好是显式并将指针调用为指针。
您不能直接在C ++中返回数组,也不能直接在C ++中传递数组参数。 你可以传递对数组的引用并返回对数组的引用,但是在这里你似乎有使用指针的指令,所以我不会去那里。
代码似乎没有使用readScores
返回的值,因此最好只使用void
返回类型。 代码无论如何都直接将值写入数组。
void readScores(double* scorePtr)
语法*(scorePTR+count)
与scorePTR[count]
完全相同,因此使用它没有任何好处。 并且代码正在以索引( count
)进行迭代。
我认为赋值对于该限制意味着什么是实际有用的东西,即使只是边缘:使用指针迭代,而不是索引。 为此,您需要找到三件事:如何启动循环,如何移动到下一个元素以及如何结束循环。
如何启动循环? 您应该从指向第一个元素的指针开始。 幸运的是,这样的指针正是作为函数的参数传递的。
for(double* ptr = scorePtr; /* ... */; /* ... */)
如何移动到下一个元素? 如果递增指针,它将移动到下一个元素。
for(double* ptr = scorePtr; /* ... */; ++ptr)
如何结束循环? 当指针经过整个数组时,循环结束。 该数组具有maxStudents
元素,因此当指针是maxStudents
元素时,循环结束:
double* end = scorePtr + maxStudents;
for(double* ptr = scorePtr; ptr != end; ++ptr)
你如何在循环中使用这个指针? 正常情况下,使用解除引用操作符。
for(double* ptr = scorePtr; ptr != end; ++ptr)
{
cout<<"Please enter score for student "<< /* (1) */ <<" or -999 to end.\n";
cin>>*ptr;
if(*ptr == -999)
break;
}
// (1) left as an exercise for the reader
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.