将修改后的数组值传递回C ++中的main函数

时间:2013-09-26 16:25:21

标签: c++

编写一个反向函数,它接受一个整数数组及其长度作为参数。您的 函数应该反转数组的内容,将反转的值保留在原始数据中 数组,什么也不返回。

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

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

4 个答案:

答案 0 :(得分:5)

您无法将一个阵列分配给另一个阵列。而是从<{1}}复制并返回reverse

a

或者可能

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

答案 1 :(得分: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];
    }
}

正如评论中指出的那样,上面显示了一种将反转数据转换为数组a的方法。这不是唯一的方法 - memcpy被认为是一种更有效的功能。更有效的方法是到位反转 - 这需要一个仅n/2次迭代的循环,而上述循环为2n,因此效率低约4倍。< / p>

我建议您研究所提供的所有答案 - 它们突出了内存处理,代码效率等方面的不同方面;从所有这些中学到的东西。

答案 2 :(得分: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;
  }
}

答案 3 :(得分:0)

啊哈,你知道你应该将int a[](指向a的指针)传递给reverse(),但你仍会遇到同样的问题。您无法修改a中存储的指针,除非您将&amp; a传递给reverse()