reverse配列アルゴリズム
1441 ワード
中間変数を使用せずに2つの変数値を交換します。アルゴリズムに従って、さらに配列に拡張することができる.
ここで注意したいのですが、change関数は交換をする時に、自分に対してしてはいけません.
これは、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になります.
#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になります.