如何从函数返回数组?

时间:2012-02-09 15:24:39

标签: c++ arrays function pointers

我正在学习课堂上的指针,但我从未真正理解数组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;
    }
}

3 个答案:

答案 0 :(得分:4)

double readScores(double scoreArray)
{
    double scoreArray[maxStudents];
    ...
}

发生编译错误是因为您声明了一个名为scoreArray的局部变量,该变量与形式参数double scoreArray的名称相同。更改其中一个的名称。

答案 1 :(得分:4)

你快到了:

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;
    }
}

P.S。:我假设你还没有开始学习STL;使用标准C ++库存在更合适的解决方案。

答案 2 :(得分:4)

您得到的错误是因为您将局部变量命名为与函数的参数相同。

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的指针。它与<{1>}的完全相同。是的,语法极具误导性。这就是你不应该使用它的原因。它播下了混乱。最好是显式并将指针调用为指针。

您不能直接在C ++中返回数组,也不能直接在C ++中传递数组参数。你可以传递对数组的引用并返回对数组的引用,但是在这里你似乎有使用指针的指令,所以我不会去那里。

代码似乎没有使用double* x返回的值,因此最好只使用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)