如何从函数返回数组
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 /* 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
的函数,该函数将指针指向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
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;
}
}
附言:我想你还没有开始学习STL;使用标准C++库存在更合适的解决方案。
- 从 C++ 中的函数返回数组地址问题
- 如何在 c++ 函数中返回数组
- 如何从 c++ 中的函数返回数组
- 为什么 c++ 函数可以正确返回数组的大小?
- 解释通过从函数引用返回数组的语法
- (C++)我的函数不返回数组
- 如何按 C++ 中的值从函数返回数组
- 返回数组中值的指针地址
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 使用数组类返回数组c++
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- 从函数 BY VALUE 返回数组,返回结构时会发生什么?
- 调用和打印函数,在 C++ 中返回数组
- 如何使用递归函数返回数组中整数的索引?
- 从函数返回数组时是否需要删除
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- C++返回数组而不进行动态内存分配?
- 在函数 c++ 中返回数组时出现问题
- 如何从C 中的函数返回数组
- 如何使类函数返回数组,然后将其调用并存储在 main 中