reverse配列アルゴリズム

1441 ワード

中間変数を使用せずに2つの変数値を交換します。アルゴリズムに従って、さらに配列に拡張することができる.
 
 
#include <stdio.h>

void change(int* a, int* b) {
    *b = *a ^ *b;
    *a = *a ^ *b;
    *b = *a ^ *b;
}

// a[]    
// cnt     
void reverse_array(int a[], int cnt) {
    int first, last;
    for(first = 0, last = cnt -1; first < last; first++, last--) {
        change(&a[first], &a[last]);
    }
}

void print_array(int a[], int cnt) {
    int i;
    for(i = 0; i < cnt; i++) {
        printf("a[%d]=%d
", i, a[i]); } } int main() { int array[5] = {1, 2, 3, 4, 5}; print_array(array, 5); reverse_array(array, 5); printf("
"); print_array(array, 5); }
 
 
ここで注意したいのですが、change関数は交換をする時に、自分に対してしてはいけません.
 
 
int x = 3;

change(&x, &x);

printf("x=%d
", x);
 
 
これは、x結果が0になる原因となります.なぜなら、change関数が参照アドレスの値を変更したからです.
 
 *b=**a^b
//この時、もし*a==**bであれば、ポル規則により、a^a=0、*bの値は0に設定され、
//またaはbで同じメモリを指しているので、賦課後*aも0に設定されています.
 *a=**a^b
//続いて*a=0^0です.では、*aはまだ0です.
 *b=**a^b
//ラスト**b=0^0、自然と0になります.