2

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

我已经使用索引进行了排序,但我也想通过使用指针来完成。目前该功能如下所示:

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

如您所见,正在使用数组索引,我将如何仅使用指针来执行此操作?

4

3 回答 3

7

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

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

会成为

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

等等。真的没有什么区别,只是索引代码更容易阅读。:)

于 2012-10-22T13:37:07.083 回答
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;
            }
        }
    }
}

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

于 2012-10-22T13:48:59.713 回答
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;
         }
     }
  } 
} 
于 2012-10-22T13:43:41.980 回答