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