交换数组指针

时间:2014-03-03 20:25:06

标签: c++

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

当我尝试运行此程序时,它会崩溃。我不知道什么是错的,我的程序的目的是使用指针交换数组的数量。我最近被介绍给我,所以我对它并不熟悉。但我认为我正在交换数字的地址而不是交换地址中的数字。如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:2)

执行以下操作时,您正在访问reverse()中的数组范围之外:

swap(ip[k], ip[size-k]);

for循环的第一次迭代中,k0size-ksize。但是数组索引从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::swapswapNum

此代码段也无效

        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。