BohYoh.comトップページへ
C & C++ FAQ
目次

C C++ 二つのポインタ値を交換する関数はどのように実現すればよいでしょうか。

 まず、正しく動作しない悪い例を示します。

/* 二つのポインタ値を交換する(正しく動作しない) */ #include <stdio.h> void swapptr(void *x, void *y) { void *temp = x; x = y; y = temp; } int main(void) { char *a = "ABC"; char *b = "123"; swapptr(a, b); /* 交換したつもり */ printf("a = %s\n", a); /* a = ABC */ printf("b = %s\n", b); /* b = 123 */ return (0); }


 main関数の呼出し側では、ポインタa, bの値を書き換えてもらうためには、そのアドレス&a, &bを渡す必要があります。したがって、ポインタのアドレスを受け取るためには、x, yの型は、ポインタへのポインタでなければなりません。
 正しくは、以下のようになります。

/* 二つのポインタ値を交換する(正しく動作) */ #include <stdio.h> void swapptr(void **x, void **y) { void *temp = *x; *x = *y; *y = temp; } int main(void) { char *a = "ABC"; char *b = "123"; swapptr(&a, &b); /* 交換 */ printf("a = %s\n", a); /* a = 123 */ printf("b = %s\n", b); /* b = ABC */ return (0); }

柴田望洋ら『C言語の鍛錬』(p.227),ソフトバンク,1996に加筆修正。
戻る

BohYoh.comロゴ