c++指针语法错误



我正在学习c++考试,我对过去的试卷有一个问题

在C++中写一个函数,它以一个双精度数组和数组的长度作为输入,并返回一个长度为其两倍的数组。返回数组的前半部分应包含原始数组内容的副本。返回的数组的后半部分应按相反顺序包含原始数组的内容。

该函数应具有以下原型:double*copy_and_reverse(double*a,int length)

由于我显然是c++新手,我陷入了解决方案的困境,到目前为止我的代码是:

double *copy_and_reverse(double *a, int length){
double *b[length*2];
for(int i=0;i<length;i++){
*b[i]=a[i];
}
for(int i=length;i<length*2;i++){
int w=length-1;
*b[i]=a[w];
w--;
}
return *b;
}
int main()
{
double nums[2]={1.23,5.364};
double *pnums=nums;
*pnums=*copy_and_reverse(pnums, 2);

我认为我的方法核心是正确的,但我只是停留在使用指针的语法上,任何帮助都是值得感激的,如果可能的话,还有背后的推理,这样我就可以为考试学习了。

您在使用此代码时遇到了一些问题。

第一个

double *b[length*2];

在这里,您要声明一个指向doubles的指针数组。该数组的大小长度为*2,但是,该数组中的指针都无效。这可能不是你想要做的。

您想要一个双人数组,大小为*2。您不能在C++中返回一个数组,但您可以返回一个指向某个内存的指针,该内存包含一个双精度数组。

让我们从为所有这些双分配足够的内存开始

double *b= new double[length * 2];

在您的第一个for循环中,您可以将结果视为数组

for(int i=0;i<length;i++){
b[i]=a[i];
}

在这里,为每个索引i复制来自a的值,使其位于同一索引。我将让您了解如何填充数组后半部分的反向部分。你走在了正确的轨道上,但你可能想考虑在一个循环中完成这一切;)

您的return语句只需要返回变量b,因为它已经是一个双*。

return b;

需要记住的一件重要的事情是,您正在用new分配这个函数中的内存。你有责任在完成后删除它。此外,当你使用new和[]进行分配时,你也必须使用[]进行删除。

delete [] b;

只需取消引用数组中的第一个项,就可以调用函数。

int main() {
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(&pnums[0], 2);//don't forget to clean up pnums afterwards!

您的代码中有很多错误。主要的一个问题是,您需要分配新的双打数组。并返回该数组。我建议将其与您的版本逐行比较:

double *copy_and_reverse(double *a, int length){
double *result = new double[length*2];
for(int i=0;i<length;i++) {
result[i]=a[i];
}
int r = length*2;
for(int i=0; i < length;i++){
result[--r]=a[i];
}
return result;
}

你的main()应该看起来像:

int main()
{
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(nums, 2);
...
delete[] pnums;
}

好的,这个至少有两个问题:

double *b[length*2];

第一个问题是,您正在声明一个本地数组(指针),然后您将尝试返回该数组:

return *b;

(你在这里也返回了错误的东西,但那是另一回事)你不能返回指向本地分配的东西的指针,因为一旦函数返回,本地分配的事情就会被破坏。相反,假设必须返回一个指向数组第一个元素的指针,则必须使用new动态分配该元素。

其次,不能使用仅在运行时已知的length来声明这样的数组。但是,当您使用new来动态分配数组时,这个问题就会得到解决。

我通常会说,你根本不应该做任何,只需要使用std::vector——但很明显,这个赋值的一个要求是使用动态分配的C样式数组。(我对你的教授有很大的意见。)

我还想说,原型:

double *copy_and_reverse(double *a, int length);

并没有像教授错误地断言的那样,声明一个采用数组的函数,而是声明一个使用指向double的指针的函数。该指针是数组中的第一个元素并不能神奇地使a成为数组。简而言之:数组和指针不是一回事。

最后两个观察只是为了你的利益。

我想这不是你的家庭作业,我想帮你。看看代码的注释。

double *copy_and_reverse(double *a, int length)
{
double * b = new double[length*2]; //create a new array using new[]
for(int i=0;i<length;i++){
b[i]=a[i];                         //addressing element with []
}
int w=length-1;                           //I assume this is what you want
for(int i=length;i<length*2;i++){
b[i]=a[w];
w--;
}
return b;
}
int main()
{ 
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(nums, 2);
delete[] pnums;
}

还请注意,内存是在函数中分配的,所以在主要情况下,您希望使用[]删除它。

最新更新