0

编写一个将整数数组及其长度作为参数的反向函数。您的函数应该反转数组的内容,将反转后的值保留在原始数组中,并且不返回任何内容。

 #include<iostream>

    using namespace std;

    void printArray(int a[], const int n)
    {
        for(int i=0;i<n;i++)
        {
            cout<<a[i];
            i!=n-1 ? cout<<", " : cout<<"";
        }
    }

    void reverse(int a[], const int n)
    {
        int reverse[n];
        for(int i=0;i<n;i++)
        {
            reverse[n-1-i]=a[i];
        }
        a = reverse;
    }

    int main()
    {
        int *a,n;
        cin>>n;
        a = new int[n];
        for(int i=0;i<n;i++)
            a[i]=0;
        a[0]=1;
        reverse(a,n);
        printArray(a,n);
        delete [] a;
        a = NULL;
        return 0;
    }

调用reverse函数后,main中的数组没有被修改,请指教!:(

4

4 回答 4

5

您不能将一个数组分配给另一个数组。而是从后复制reversea

std::copy(reverse, reverse + n, a);

或者可能

memcpy(a, reverse, n * sizeof(int));
于 2013-09-26T16:29:17.083 回答
4

您不是将数据从reverse后面复制到a- 您而是将其 ( a) 指向一个在函数返回后将不再存在(有效)的内存位置。您需要将值从reverse回复制到a. 我建议不要对函数和变量使用相同的名称。

尝试

void reverse(int a[], const int n)
{
    int reverse[n];
    for(int i=0;i<n;i++)
    {
        reverse[n-1-i]=a[i];
    }
    for(int i=0;i<n;i++)
    {
        a[i]=reverse[i];
    }
}

正如评论中指出的那样,上面显示了一种将反转数据放入 array 的方法a。这不是唯一的方法 -memcpy被认为是一种更有效的使用功能。更有效的方法是进行原地反转——这将需要一个仅n/2迭代的循环,而上面的循环是 for 2n,因此效率降低了大约 4 倍。

我建议您研究所有提供的答案——它们突出了内存处理、代码效率等的不同方面;向他们所有人学习的东西。

于 2013-09-26T16:29:08.807 回答
1

指点!它们真的很有用。

void reverse (int *a, const size_t n)
{
  int *b = a + n - 1;
  while (b > a)
  {
    const int swap_value = *a;
    *a = *b;
    *b = swap_value;
    ++a;
    --b;
  }
}
于 2013-09-26T16:36:53.230 回答
0

啊哈,你知道你应该传递int a[], 一个指向a, to的指针reverse(),但你仍然遇到同样的问题。您不能修改存储在 中的指针a,除非您将 &a 传递给reverse().

于 2013-09-26T16:29:37.417 回答