通过引用对数组进行排序

时间:2012-01-10 19:36:03

标签: c++

我做了一个简单的例程来排序一个数组,接受一个参数数组作为参数,问题是当我比较值时,数组[i]在调试器中显示正确的值但是数组[i + 1]显示了伪造价值...我猜是一个指针问题,但我无法弄清楚我做错了什么。

以下是代码:

typedef int vector[10];

void task1(vector * param)
{
    bool ordered = false;
    while (!(ordered))
    {
        int tmp = 0;
        ordered = true;
        for (int i = 0; i < 9 ; i++)
        {
            if (*param[i] > *param[i+1])
            {
                tmp = *param[i];
                *param[i] = *param[i + 1];
                *param[i + 1] = tmp;
                ordered = false;
            }
        }
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    vector tavi = {10,88,77,192,7,27,82,1,882,13};

    task1(&tavi);
    for (int i = 0 ; i < 10 ; i ++)
        printf("%d ",tavi[i]);

    _getch();


    return 0;
}

3 个答案:

答案 0 :(得分:4)

下标 - 运算符([])的优先级高于derefence运算符(*),因此*param[i]实际上是*(param[i])。这意味着,您首先转到param的第i个元素,然后取消引用它 - 这不是您想要的(param不是指向数组的指针)。你想取消引用param然后转到第i个元素 - 这将是(*param)[i]

答案 1 :(得分:2)

首先:你为什么要自己编写排序(更不用说bubblesort不是很快)。 那么为什么不简单地使用

std::sort(tavi, tavi + 10, std::less<int>());

当然,如果你有C ++ 11或者提升它也是一个好主意,忘记c样式数组并改用std::arrayboost::array

std::array<int, 10> tavi = {10,88,77,192,7,27,82,1,882,13};

std::sort(tavi.begin(), tavi.end(), std::less<int>());
for (int i = 0 ; i < tavi.size(); i ++)
    std::cout<<tavi[i]<<" ";

如果您真的想这样做,*param[i]*(param[i])相同,而您想使用(*param)[i]

答案 2 :(得分:1)

vectorint[10]类型。因此,vector* is type int(*)[10]。也就是说,指向10个int的数组的指针。因此,param[i]param[i+1]之间的距离为sizeof(int) * 10

执行此操作时:

if (*param[i] > *param[i+1])

您正在将一个10个整数的数组与下一个10个整数的数组进行比较。我希望这不会编译,遗憾的是,发生的是数组被隐式转换为指向其第一个元素的指针。因为我&lt; i + 1,上述比较永远不会成真。