#include <iostream>
#include <cstdlib>
using namespace std;
void swapNum(int *q, int *p)
{
int temp;
temp = *q;
*q = *p;
*p = temp;
}
void reverse(int *ip, int const size)
{
for (int k = 0; k < size; k++)
{
if (k == (size/2))
{
int *q = &ip[k];
int *p = &ip[k+1];
swapNum(q,p);
break;
}
else
swap(ip[k], ip[size-k]);
}
}
int main()
{
const int size = 20;
int arr[size];
int *ip;
ip = arr;
cout << "Please enter 20 different numbers." << endl;
for (int i = 0; i < size; i++)
{
cout << "\nNumber " << i+1 << " = ";
cin >> ip[i];
}
reverse(ip, size);
cout << "I will now print out the numbers in reverse order." << endl;
for (int j = 0; j < size; j++)
{
cout << ip[j] << " ";
}
return 0;
}
当我尝试运行此程序时,它会崩溃。我不知道什么是错的,我的程序的目的是使用指针交换数组的数量。我最近被介绍给我,所以我对它并不熟悉。但我认为我正在交换数字的地址而不是交换地址中的数字。如果我错了,请纠正我。
答案 0 :(得分:2)
执行以下操作时,您正在访问reverse()
中的数组范围之外:
swap(ip[k], ip[size-k]);
在for
循环的第一次迭代中,k
为0
,size-k
为size
。但是数组索引从0
运行到size-1
。所以它应该是:
swap(ip[k], ip[size-k-1]);
但我在你的程序中没有看到swap
的定义。我认为它应该是:
swapNum(&ip[k], &ip[size-k-1]);
另一项改进:不是专门处理size == k/2
并使用break
,而是使用size < k/2
作为for
循环中的绑定测试。
答案 1 :(得分:1)
swap(ip[k], ip[size-k]);
你的问题在那里。当size - k
为0时k
将导致未定义的行为(访问数组超出范围)。您reverse
中的循环结构可以简化:
for (int k = 0; k < size / 2; k++)
swapNum(&ip[k], &ip[size - k - 1]); // updated to use the address since your swap function takes pointers.
答案 2 :(得分:0)
功能反转无效
void reverse(int *ip, int const size)
{
for (int k = 0; k < size; k++)
{
if (k == (size/2))
{
int *q = &ip[k];
int *p = &ip[k+1];
swapNum(q,p);
break;
}
else
swap(ip[k], ip[size-k]);
}
}
例如,当k等于0时,则调用
swap(ip[0], ip[size]);
但是数组没有索引大小的元素。
另外你弄乱了两个函数std::swap
和swapNum
此代码段也无效
if (k == (size/2))
{
int *q = &ip[k];
int *p = &ip[k+1];
swapNum(q,p);
break;
}
如果大小是代码中的偶数(或奇数),那么您将进行错误的交换。例如,如果size等于20,那么你应该交换ip [9 [with ip [10]。但是根据上面的代码片段,你用ip [11]交换ip [10]。
您可以使用标准算法std::reverse
例如
#include <algorithm>
#include <iterator>
//...
std::reverse( std::begin( arr ), std::end( arr ) );
或
#include <algorithm>
//...
std::reverse( arr, arr + size );
如果您想自己编写函数,那么它可能看起来像
void reverse( int a[], int size )
{
for (int k = 0; k < size / 2; k++)
{
int tmp = a[k];
a[k] = a[size-k-1];
a[size-k-1] = tmp;
}
}
或者如果你想使用你的函数swapNum那么
void reverse( int a[], int size )
{
for (int k = 0; k < size / 2; k++)
{
swapNum( &a[k], &a[size-k-1] );
}
}
编辑:我从第一个输入错误的参数中删除了限定符const。