如何从函数返回数组

How do I return a array from a function?

本文关键字:返回 数组 函数      更新时间:2023-10-16

我在课堂上学习指针,但我从未真正理解数组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++库存在更合适的解决方案。