【发布时间】:2015-04-20 17:29:05
【问题描述】:
#include <iostream>
using namespace std;
int* flipArray(int input[], int n)
{
int output[n];
int pos = 0;
for (int i = n-1; i >= 0; i--)
{
output[pos++] = input[i];
}
int* p = output;
for (int k = 0; k < n; k++)
cout << *p-k << endl << endl;
return p;
}
int main()
{
const int SIZE = 5;
int firstArray[SIZE];
for (int n = 0; n < SIZE; n++)
{
firstArray[n] = n+1;
}
int* a;
a = flipArray(firstArray, SIZE);
for (int j = 0; j < SIZE; j++)
cout << *a-j << endl;
cout << endl;
cout << *a << '\t' << *a+1 << '\t' << *a+2;
return 0;
}
我正在尝试使用返回指针的函数来翻转 firstArray,但我很难理解使用指针访问索引的工作原理。
这就是我感到困惑的原因: 在函数flipArray中,如下for循环:
for (int k = 0; k < n; k++)
cout << *p-k << ' ';
将“5 4 3 2 1”打印到控制台。我的理解是,我应该使用*(p+k) 而不是*(p-k) 访问向量的元素。如果我打印*(p+k),“5 6 7 8 9”将打印到控制台。如果我打印不带指针的数组并使用 k 作为索引位置,则会将“5 4 3 2 1”打印到控制台。
然而,在我的 main 函数中,*a 的值是从 flipArray 函数分配的指针 p,我没有得到相同的结果:
for (int j = 0; j < SIZE; j++)
cout << *a-j << endl;
打印 5 0 -1 -2 -3 到控制台,然后
for (int j = 0; j < SIZE; j++)
cout << *a+j << endl;
打印 5 2 3 4 5 到控制台。
另外,我认为*p的指针位置和*a的位置指针应该是一样的!但是当我在函数中打印地址&p时,我得到了0x28fde0的位置,当我在main中打印&a的地址时,我得到了0x28fedc的位置。当然,这些都是在同一次运行中完成的。
谁能告诉我我误入歧途了?谢谢!
感谢大家提供的信息丰富的答案。
我已经更新了我的解决方案,现在它正在返回我所期望的结果。我有一个关于内存泄漏以及何时需要删除指针的新问题。
int* flipArray(int input[], int n)
{
int* output = new int[n];
int pos = 0;
for (int i = n-1; i >= 0; i--)
output[pos++] = input[i];
return output;
}
int main()
{
const int SIZE = 5;
int firstArray[SIZE];
for (int n = 0; n < SIZE; n++)
{
firstArray[n] = n+1;
}
int* a;
a = flipArray(firstArray, SIZE);
for (int j = 0; j < SIZE; j++)
cout << a[j] << " "; // can also be written as *(a+j), which is more prone to bugs
delete [] a;
return 0;
}
函数flipArray返回时指针输出会被删除吗?如果没有,我应该如何在返回的同时删除输出?在我的主函数中删除指针 a 是否与删除输出相同,因为它们指向相同的位置?
【问题讨论】:
-
返回一个指向本地数组的指针 :(
-
我没有收到
*p-k。看起来应该是cout << *p+k << endl << endl -
从堆栈中创建的不正确的变量返回地址
-
考虑 std::reverse
-
在你的新代码中,
delete a;应该是delete [] a;