c ++指针语法错误

时间:2014-01-14 19:10:19

标签: c++ arrays pointers

我正在攻读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);

我认为我的方法核心是正确的,但我只是坚持使用指针的语法,任何帮助都是值得赞赏的,如果可能的话,背后的理由让我可以学习考试。

4 个答案:

答案 0 :(得分:1)

您的代码中存在很多错误。主要的是你需要分配新的双精度数组。并返回该数组。我建议逐行与您的版本进行比较:

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

答案 1 :(得分:1)

这段代码存在一些问题。

第一

double *b[length*2];

这里你要声明一个指向双打的指针数组。该数组的大小为* 2,但此数组中的指针均无效。这可能不是你想要做的。

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

让我们首先为所有那些双打分配足够的内存

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

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

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

在这里,您要将每个索引i的值复制到相同的索引。我会让你弄清楚如何填充数组后半部分的反向部分。你是在正确的轨道上,但是你可能想要在一个循环中考虑这一切;)

你的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!

答案 2 :(得分:0)

好的,至少有两个问题:

double *b[length*2];

第一个问题是你声明一个本地数组(指针),然后你会尝试返回:

return *b;

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

其次,你不能使用仅在运行时知道的length来声明这样的数组。但是,当您使用new动态分配数组时,将避免此问题。

我通常会说你根本不应该做任何,而只是使用std::vector - 但显然这个任务的要求是动态使用分配C风格的数组。 (我对你的教授提出了很大的问题。)

我也会说原型:

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

没有声明一个带有数组的函数,因为你的教授错误地断言,而是一个带有指针double的函数。该指针是数组中的第一个元素并不会使a成为一个数组。简而言之:数组和指针不是一回事。

最后两个观察结果只是为了您的利益。

答案 3 :(得分:0)

我认为这不是你的功课,我正在努力帮助你。 看看代码的评论。

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

还注意到内存是在函数中分配的,所以在main中,你想用[]来删除它。