[C]ポインタを使用して2つの変数の値を交換する


#include <stdio.h>

void swap(int a, int b);

int main(void)
{
    int x = 1;
    int y = 2;
    
    printf("x is %i, y is %i\n", x, y);
    swap(x, y);
    printf("x is %i, y is %i\n", x, y);
}

void swap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
以上のコードは変数xとyの値を交換するために作成されたコードである.
果たしてxとyの値は変わったのだろうか.

出力値を確認しても変更はありません.どうして変わらないの?
その理由はswap関数がx,yのレプリケーション値をパラメータとするa,bを互いに置換するだけで,実際のxとyを変更しないからである.
プログラム内の関数に関連するものはメモリのスタックと呼ばれる領域に格納され、上のコードを実行すると、stackは次のようなことが起こります.

mainを呼び出すと、スタックにx、yの2つの変数の領域が割り当てられ、それぞれ1と2に初期化されます.
次に、swapが呼び出されると、既存の領域の上にa、b、およびtmp用の領域が堆積する.
次に、aおよびbの値が変化し、swap関数が終了すると、a、bおよびtmpが存在する領域は消失する.
しかし、このときx,yはまったく影響を受けていないので、私たちが望んでいる結果を得ることはできません.
この問題を解決するにはどうすればいいですか.
方法は、x、yの値ではなく、aおよびbにx、yを格納するアドレスを格納することである.
コードは以下の通りです.
swapのパラメータにx,yのアドレス&x,&yを加えた.int *aにおいて、intはaがint値であり、*はaがポインタであることを示す.
#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
    int x = 1;
    int y = 2;

    swap(&x, &y);
}

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
x,yはそれぞれ1,2に初期化され,a,bはそれぞれxとyを指す.int tmp = *atmpをaで示す値に初期化します.すなわちtmpは1である.*a = *baが指す場所にbが指す値を格納する.すなわち、aには2が格納される.*b = tmp次に、bが指す場所にtmpの値を格納する.すなわち、bに1を格納する.

また印刷すると、私たちが欲しい結果を得たことがわかります.

今は針に親しむ時間です.
この投稿は、ガイダンスレッスンCS 50の復習の観点から書かれています.
フィードバックを歓迎します.
-終了-