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 に答える