首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从函数返回数组?

如何从函数返回数组?
EN

Stack Overflow用户
提问于 2012-02-09 23:24:39
回答 3查看 663关注 0票数 2

我在课堂上学习指针,但我从来没有100%理解数组。

我有一个作业,我必须从一个函数中读取学生成绩的数组。数组中的每个元素都有不同的分数,元素标识它是哪个学生。

我试图将分数读入数组,但当返回它时,我就迷失了方向。我试过google,但我更困惑了,因为人们都在谈论动态内存和使用新的和delete操作数,而我还没有做到这一点,我不想做错赋值。

我必须使用用户指针而不是索引来访问数组中的元素。下面的代码给出了错误"redefinition of formal parameter 'scoreArray'“

代码语言:javascript
运行
复制
#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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 23:55:04

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

代码语言:javascript
运行
复制
double readScores(double scoreArray /* parameter named scoreArray */)
{
    double scoreArray[maxStudents]; // this cannot have the same name!

您所显示的代码揭示了很多混淆。我会试着解释其中的错误。

代码语言:javascript
运行
复制
cout<<scoreArray[1],scoreArray[2];

这不会输出元素1和2。要这样做,它应该是cout << scoreArray[1] << scoreArray[2];。还要注意,C++中的数组是从0开始的,因此第一个元素是scoreArray[0],第二个是scoreArray[1],第三个是scoreArray[2],依此类推。

该代码声明了一个名为readScores的函数,该函数接受指向double的指针并返回一个double

代码语言:javascript
运行
复制
double readScores(double[]);

但它只定义了一个接受double的函数

代码语言:javascript
运行
复制
double readScores(double scoreArray)

我确信这不是我们想要的,一旦编译器错误被修复,它将产生一个链接器错误,因为没有对double readScores(double[])函数的定义。

现在,数组。

当您将参数编写为double x[]时,它不是一个数组。它是一个指向double的指针。它与double* x完全相同。是的,语法具有很强的误导性。这就是为什么你不应该使用它。它播下了混乱的种子。最好是显式地将指针称为指针。

在C++中不能直接返回数组,在C++中也不能直接传递数组参数。您可以传递对数组的引用,也可以返回对数组的引用,但这里似乎有使用指针的说明,因此我不再赘述。

代码似乎没有使用从readScores返回的值,所以只使用void返回类型可能更好。无论如何,代码都会将值直接写入数组。

代码语言:javascript
运行
复制
void readScores(double* scorePtr)

语法*(scorePTR+count)scorePTR[count]完全相同,所以使用它没有任何好处。无论如何,代码都是使用索引(count)进行迭代的。

我认为赋值对这个限制的意义实际上是有用的,即使只是略微有用:使用指针而不是索引进行迭代。为此,您需要找到三件事:如何开始循环,如何移动到下一个元素,以及如何结束循环。

如何启动循环?您应该从指向第一个元素的指针开始。幸运的是,这样的指针正是作为参数传递给函数的。

代码语言:javascript
运行
复制
for(double* ptr = scorePtr; /* ... */; /* ... */) 

如何移动到下一个元素?如果递增指针,它将移动到下一个元素。

代码语言:javascript
运行
复制
for(double* ptr = scorePtr; /* ... */; ++ptr)

如何结束循环?当指针经过整个数组时,循环结束。该数组具有maxStudents元素,因此当指针远离开始处的maxStudents元素时,循环结束:

代码语言:javascript
运行
复制
double* end = scorePtr + maxStudents;
for(double* ptr = scorePtr; ptr != end; ++ptr)

如何在循环中使用这个指针?正常情况下,使用取消引用运算符。

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-02-09 23:27:18

代码语言:javascript
运行
复制
double readScores(double scoreArray)
{
    double scoreArray[maxStudents];
    ...
}

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

票数 4
EN

Stack Overflow用户

发布于 2012-02-09 23:28:15

你就快成功了:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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++库可以找到更合适的解决方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9213631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档