繁体   English   中英

如何从函数返回数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM