使用指针而不是索引进行排序

时间:2012-10-22 13:34:52

标签: c arrays sorting

我正在尝试使用指针而不是索引对指针数组进行排序,但我不完全确定如何执行此操作。我一直在谷歌搜索,但没有找到任何相关的东西。

我已经使用索引完成了排序工作,但我也希望通过使用指针来实现。目前该功能如下所示:

void sort(int *pointer, int size){
    int i, j, temp;
    for(i = 0; i < size; i++){
        for(j = i + 1; j < size; j++){
            if(pointer[j] < pointer[i]){
                temp = pointer[j];
                pointer[j] = pointer[i];
                pointer[i] = temp;
            }
        }
    }
}

如您所见,正在使用数组索引,如何仅使用指针?

3 个答案:

答案 0 :(得分:7)

这会很烦人。您需要使用C中的事实a[i] == *(a + i),因此:

if(pointer[j] < pointer[j])

会变成

if(*(pointer + j) < *(pointer + j))

等等。除了索引代码更容易阅读之外,没有什么区别。 :)

答案 1 :(得分:4)

您可以使用指针替换索引:

void sort(int *pointer, int size){
    int *i, *j, temp;
    for(i = pointer; i < pointer + size; i++){
        for(j = i + 1; j < pointer + size; j++){
            if(*j < *i){
                temp = *j;
                *j = *i;
                *i = temp;
            }
        }
    }
}

理论上,这应该比每次需要访问元素时添加索引更快。实际上,大多数编译器都会优化你的原始循环以便以这种方式使用指针。

答案 2 :(得分:2)

方括号([])实际上只是一个“添加和取消引用”运算符。因此,要转换代码,请将something[x]替换为*(something+x)

void sort(int *pointer, int size){
  int i, j, temp;
  for(i = 0; i < size; i++){
     for(j = i + 1; j < size; j++){
         if(*(pointer+j) < *(pointer+i)){
             temp = *(pointer+j);
             *(pointer+j) = *(pointer+i);
             *(pointer+i) = temp;
         }
     }
  } 
}