【问题标题】:c++ pointer syntax errorc++指针语法错误
【发布时间】:2014-01-15 03:27:37
【问题描述】:

我正在准备 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);

我认为我的方法的核心是正确的,但我只是停留在使用指针的语法中,感谢任何帮助,如果可能的话,请提供其背后的推理,以便我可以为考试学习。

【问题讨论】:

  • 您取消引用 b 的元素而不为它们分配内存。
  • 每次使用 b 以及分配 pnums 时都会不必要地取消引用。查找有关指针使用的教程,主要是解引用的用途。此外,您的b 数组将在您的函数返回时被销毁,您应该动态分配它。
  • 查找dynamic memory allocation。这就是你想要使用的。
  • 先说你的教授是个白痴。原型copy_and_reverse(double *a, int length); 不采用数组,它采用指向数组中第一个元素的指针。
  • 要继续,您是否收到编译器错误?您究竟需要什么帮助?

标签: c++ arrays pointers


【解决方案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];
}

在这里,您从 a 中复制每个索引 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】:

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

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

【讨论】:

    【解决方案3】:

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

    double *b[length*2];
    

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

    return *b;
    

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

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

    我通常会说您根本不应该这样做任何,而只需使用std::vector - 但显然此分配的要求是使用动态分配的 C样式数组。 (我对你的教授有很大的争议。)

    我还要说原型:

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

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

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

    【讨论】:

      【解决方案4】:

      我认为这不是你的作业,我正在努力帮助你。 看代码注释。

          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中,你想用[]删除它。

      【讨论】:

        猜你喜欢
        • 2017-09-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多