我在课堂上学习指针,但我从来没有100%理解数组。
我有一个作业,我必须从一个函数中读取学生成绩的数组。数组中的每个元素都有不同的分数,元素标识它是哪个学生。
我试图将分数读入数组,但当返回它时,我就迷失了方向。我试过google,但我更困惑了,因为人们都在谈论动态内存和使用新的和delete操作数,而我还没有做到这一点,我不想做错赋值。
我必须使用用户指针而不是索引来访问数组中的元素。下面的代码给出了错误"redefinition of formal parameter '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;
    }
}发布于 2012-02-09 23:55:04
您得到的错误是因为您命名了一个与函数参数相同的局部变量。
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发布于 2012-02-09 23:27:18
double readScores(double scoreArray)
{
    double scoreArray[maxStudents];
    ...
}编译错误的发生是因为您使用与形参double scoreArray同名的名称scoreArray声明了一个局部变量。更改其中一个的名称。
发布于 2012-02-09 23:28:15
你就快成功了:
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++库可以找到更合适的解决方案。
https://stackoverflow.com/questions/9213631
复制相似问题