総称ポインタを使ったswap関数

K&R本 5-11

今までswap関数として以下のものを使っていました

void swap (int *a, int *b) {
    int work = *a;
    *a = *b;
    *b = work;
}

しかし、これだと別の型の場合に同じような別の関数を作らなくてはいけないので面倒でした。

これに対するK&R本に一つの解が載っていました。

void *にキャストした配列を渡して交換するという処理でした。

#include <stdio.h>

void swap (void **ary,int a,int b) {
    void *work;
    work   = ary[a];
    ary[a] = ary[b];
    ary[b] = work;
}

int main (void) {
    int num[] = {1,2};
    int i;
    
    swap((void **)num,0,1);
    
    for(i=0;i<2;++i){
        printf("%d ",num[i]);
    }
    
    return 0;
}

配列のデータ以外の交換はできませんが型を気にせずとも値の交換が出来るので便利です。

ただし、いまいち何故コレがちゃんと動くのか理解できていません。

もう少しこの総称ポインタについて理解を深めないといけないですね。

とりあえずこの配列使用版swap関数はaswap関数としてmylib.hに追加しておこうと思います。