编写一个反向函数,它接受一个整数数组及其长度作为参数。您的 函数应该反转数组的内容,将反转的值保留在原始数据中 数组,什么也不返回。
#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中的数组没有修改,请指教! :(
答案 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()
。